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(){}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值