對於線程加鎖synchronized可能存在的誤區的解析


使用synchronized之后,並不是說synchronized鎖定的方法或者代碼塊要一次性執行完,才能跳轉到其他線程。而是當兩個並發線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時,一個時間內只能有一個線程得到執行。另一個線程必須等待當前線程執行完這個代碼塊以后才能執行該代碼塊。也即是說,即使給某個方法加鎖了,如果其他線程訪問不是這個方法時,線程依然可以跳轉。如下例子:

 1 public class test2{
 2     public static void main(String[] args) {
 3         Thread a=new A2();
 4         Thread b=new B2();
 5         a.start();
 6         b.start();
 7     }
 8 }
 9 
10 class A2 extends Thread{
11     public void run(){
12         show1();
13     }
14     public synchronized void show1(){
15         for(int i=0;i<20;i++){
16             System.out.print(i);
17         }
18     }        
19 }
20 
21 class B2 extends Thread{
22     public void run(){
23         show2();
24     }
25     public synchronized void show2(){
26         for (int i = 0; i < 20; i++) {
27             System.out.print(i);
28         }
29     }
30 }

創建了兩個線程,分別訪問自己的加鎖show方法,最終的結果不一定是兩個連續的1-19,我的運行結果如下:

001122334455667788991010111112121313141415161718191516171819

所以synchronized只是對於訪問同一方法的不同線程有效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM