• Java线程同步


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

    package com.wjy.synchronize;
    
    public class MyThread implements Runnable{
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            synchronized (this) {
                for(int i=0;i<10;i++){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"   loop   "+i);
                }
            }
        }
        
    }

    测试代码:

    package com.wjy.test;
    
    import com.wjy.synchronize.MyThread;
    
    public class MainTestSyn {
        public static void main(String args[]){
            MyThread myThread=new MyThread();
            
            Thread thread1=new Thread(myThread, "buDog");
            Thread thread2=new Thread(myThread, "paoDog");
            
            thread1.start();
            thread2.start();
        }
    }

    运行结果:

    buDog   loop   0
    buDog   loop   1
    buDog   loop   2
    buDog   loop   3
    buDog   loop   4
    buDog   loop   5
    buDog   loop   6
    buDog   loop   7
    buDog   loop   8
    buDog   loop   9
    paoDog   loop   0
    paoDog   loop   1
    paoDog   loop   2
    paoDog   loop   3
    paoDog   loop   4
    paoDog   loop   5
    paoDog   loop   6
    paoDog   loop   7
    paoDog   loop   8
    paoDog   loop   9

    //*********************************************************************************************************************

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

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

    拿二和三同时比较:

    先看看二的代码:

    package com.wjy.synchronize;
    
    public class MyThread implements Runnable{
    
        
        public void fun1(){
            synchronized (this) {
                for(int i=0;i<10;i++){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"   loop fun1   "+i);
                }
            }
        }
        
        public void fun2(){
            //synchronized (this) {
                for(int i=0;i<10;i++){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"   loop fun2   "+i);
                }
            //}
        }
        @Override
        public void run() {
            // TODO Auto-generated method stub
            
        }
        
    }

    测试代码:

    package com.wjy.test;
    
    import com.wjy.synchronize.MyThread;
    
    public class MainTestSyn {
        public static void main(String args[]){
            final MyThread myThread=new MyThread();
            
    //        Thread thread1=new Thread(myThread, "buDog");
    //        Thread thread2=new Thread(myThread, "paoDog");
            
            Thread thread1=new Thread(new Runnable() {
                
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    myThread.fun1();
                }
            }, "buDog");
            Thread thread2=new Thread(new Runnable() {
                
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    myThread.fun2();
                }
            }, "paoDog");
            thread1.start();
            thread2.start();
        }
    }

    结果:

    buDog   loop fun1   0
    paoDog   loop fun2   0
    buDog   loop fun1   1
    paoDog   loop fun2   1
    buDog   loop fun1   2
    paoDog   loop fun2   2
    paoDog   loop fun2   3
    buDog   loop fun1   3
    paoDog   loop fun2   4
    buDog   loop fun1   4
    paoDog   loop fun2   5
    buDog   loop fun1   5
    paoDog   loop fun2   6
    buDog   loop fun1   6
    paoDog   loop fun2   7
    buDog   loop fun1   7
    paoDog   loop fun2   8
    buDog   loop fun1   8
    buDog   loop fun1   9
    paoDog   loop fun2   9

    但是来看看三的代码,三的代码很简单就是在二的fun2()中的代码置为

    synchronized 即可,就是将二中fun2()的注释释放就行了,其余都不用动。看看运行结果:
    buDog   loop fun1   0
    buDog   loop fun1   1
    buDog   loop fun1   2
    buDog   loop fun1   3
    buDog   loop fun1   4
    buDog   loop fun1   5
    buDog   loop fun1   6
    buDog   loop fun1   7
    buDog   loop fun1   8
    buDog   loop fun1   9
    paoDog   loop fun2   0
    paoDog   loop fun2   1
    paoDog   loop fun2   2
    paoDog   loop fun2   3
    paoDog   loop fun2   4
    paoDog   loop fun2   5
    paoDog   loop fun2   6
    paoDog   loop fun2   7
    paoDog   loop fun2   8
    paoDog   loop fun2   9

    这里必须声明:以上所有同步块修改为同步方法结果不变,就是在方法上声明
    synchronized ,像这样:public synchronized void fun1(){}
  • 相关阅读:
    Django学习路10_创建一个新的数据库,指定列名并修改表名
    设计模式_单例模式的懒汉式实例化
    设计模式_理解单例设计模式
    Django学习路9_流程复习
    Django学习路8_学生表和班级表级联并相互查询信息
    Django学习路7_注册app到能够在页面上显示app网页内容
    es6基础:类、继承、重写
    简单的下拉刷新
    callback&&callback()
    转 五大浏览器四大内核
  • 原文地址:https://www.cnblogs.com/wangjiyuan/p/tongbu1.html
Copyright © 2020-2023  润新知