zoukankan      html  css  js  c++  java
  • 线程同步实例

    synchronize(this) 字段:

    http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html

     一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

         二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

         三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

    实例:两个线程一个连续打印A 一个连续打印B

    使两个打印顺序如下 ABABABAB。。。

    package com.thread;
    
    public class TestPrintAB {
    
        static class TestPrint implements Runnable {
    
            String s;
    
            public TestPrint(String s) {
                this.s = s;
            }
    
            public void start() {
                new Thread(this).start();
                isRun = true;
            }
    
            public synchronized void resume() {
                isRun = true;
                notify();
            }
    
            boolean isRun = false;
    
            @Override
            public void run() {
                try {
                    for (int i = 0; i < 10; i++) {
                        System.out.print(i + s + ",");
                        Thread.sleep(50);
                        isRun = false;
                        callback();
                        synchronized (this) {
                            while (!isRun) {
                                wait();
                            }
    
                        }
                    }
    
                    callback();
    
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
            public void callback() {
    
            }
        }
    
        TestPrint tp1 = null;
        TestPrint tp2 = null;
    
        public static void main(String[] args) {
    
            final TestPrintAB test = new TestPrintAB();
    
            test.tp1 = new TestPrint("A") {
                @Override
                public void callback() {
                    test.tp2.resume();
                }
            };
            test.tp2 = new TestPrint("B") {
                @Override
                public void callback() {
                    test.tp1.resume();
                }
            };
            ;
            test.tp1.start();
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            test.tp2.start();
        }
    
    }
  • 相关阅读:
    EBGAN
    Inception Score
    对称加密系统,攻击方式
    tensorboard的使用
    pip更新后,下载慢,国内更新源
    VSCODE快捷键
    Ajax JS
    ORM操作之Django后台管理、外键、QuerySet、查询sql语句、用户管理
    ORM操作之分类、创建数据库表结构流程、基本操作、操作表结构、字段类型、字段参数
    路由系统 视图 默认数据交互规则 获取用户提交信息
  • 原文地址:https://www.cnblogs.com/wjw334/p/3633892.html
Copyright © 2011-2022 走看看