java thread synchronized 理解

 

  Java Thread 用起来并不难,但往往还是容易出错。

我们知道 synchronized  关键字主要是防止多线程访问共享资源。

下面是个简单的测试,关于synchronized 使用。

 

  

 

 

     2个线程访问printA方法,这个打印结果是:

 Thread[Thread-0,5,main] valueA:1
Thread[Thread-1,5,main] valueA:1
Thread[Thread-0,5,main] valueA:1
Thread[Thread-1,5,main] valueA:1
Thread[Thread-1,5,main] valueA:1
Thread[Thread-0,5,main] valueA:1

    

    在printA方法上增加  synchronized 打印结果;

 Thread[Thread-0,5,main] valueA:1
 Thread[Thread-0,5,main] valueA:1
 Thread[Thread-0,5,main] valueA:1
 Thread[Thread-0,5,main] valueA:1
 Thread[Thread-0,5,main] valueA:1

 

同时只能是一个线程访问printA方法.

 

下面在Message类中添加一个 printB方法,并且加上synchronized 关键字.

 

 public synchronized  void printB() {
  while (true) {
   try {
    Thread.sleep(1000);
   } catch (Exception e) {
    e.printStackTrace();
   }
  System.out.println("" + Thread.currentThread() + " valueB:" + value);
  }
 }

 

 2个线程分别访问 printA 和 printB 方法.

 如果不测试,我的理解是 printA 和 printB 都能交替打印结果,因为2个线程访问不同的方法,尽管有synchronized 关键字 ,实际并非.

 Thread[Thread-0,5,main] valueA:1
Thread[Thread-0,5,main] valueA:1
Thread[Thread-0,5,main] valueA:1
Thread[Thread-0,5,main] valueA:1

 打印的结果任然只有 一个线程访问。

 

主要的原因是 synchronized 关键字并非只 锁定当前修饰的方法,它其实锁定了整个class中synchronized 修饰过的方法。

只要是其它线程访问到synchronized 修饰的方法和代码块 ,都不能被访问。

但如果是 在printA上加个static 结果是怎样, 测试的结果是 交替打印,在把printB上加上static后, 此时只能有一个方法能执行。

因此,synchronized 是锁定同种类的方法, 如果加了static修饰,只锁定所有static的方法。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值