日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Java多线程同步Synchronized深入解析

發布時間:2025/3/15 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java多线程同步Synchronized深入解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(轉自:http://www.51testing.com/html/03/n-827703.html) 

同步的概念:

  同步分為同步方法和同步塊兩種方式。

  鎖定的內容分為鎖定類的某個特定實例和鎖定類對象(類的所有實例)

  變量分為實例變量(不帶static的變量)和類變量(帶static的變量)

  使用同步的原因

  1、在系統中對訪類要使用多線程進行訪問;

  2、在該類中有 類變量,或者是 在類的方法中有訪問公共資源(如一個外部文件的讀寫)。

  同步鎖鎖定的內容是什么?

  無論你將Synchronized加在方法前還是加在一個變量前,其鎖定的都是一個 類對象。每一個對象都只有一個鎖與之相關聯。

  下例中分情況的列舉各種情況下的同步效果

  1、Synchronized 加在方法上,(同步方法,鎖定類實例)

  Java代碼

public class Demo1 {????????
??? public synchronized void m1(){???????????? //...............??
? }????
??? public void m2(){??????????? //............????
synchronized(this){??????????????? //.........??
}??? //........????
}
??? }

  這兩種寫法的效果是一樣的,鎖定的都是類實例對象。如果有一個 類實例對象: demo = new Demo1(),另外有兩個線程: thread1,thread2,都調用了demo 對象,那么,在同一時間,如果 thread1調用了demo.m1(),則thread2在該時間內不能訪問demo.m1() 和 demo.m2(); 因為thread1把demo這個對象的鎖使用了,所以無法分給其它線程使用

  但是,如果thread1調用 demo1.m1(),thread2調用 demo2.m1(),則可以同時進行,因為它們調用的是不同的Demo1類對象實例。

  2、Synchronized 加在變量上,(同步塊,鎖定類實例)

  Java代碼

  • public?class?Demo2?{??? ?

  • ????Object?a?=?new?Object();??? ?

  • ????Object?b?=?new?Object();??? ?

  • ?? ?

  • ????public?void?m1(){??? ?

  • ????????//............??? ?

  • ?? ?

  • ????????synchronized(a){??? ?

  • ????????????//.........??? ?

  • ????????}??? ?

  • ?? ?

  • ????????//........??? ?

  • ????}??? ?

  • ?? ?

  • ????public?void?m2(){??? ?

  • ????????//............??? ?

  • ?? ?

  • ????????synchronized(b){??? ?

  • ????????????//.........??? ?

  • ????????}??? ?

  • ?? ?

  • ????????//........??? ?

  • ????}??? ?

  • }

  這種情況下,是實現代碼塊鎖定,鎖定的對象是 變量a或b;(注意,a 、b 都是非static 的)如果有一個 類實例對象:demo = new Demo2(),另外有兩個線程:thread1,thread2,都調用了demo對象,那么,在同一時間,如果 thread1調用了demo.m1(),則thread2在該時間內可以訪問demo.m2();但不能訪問 demo.m1()的同步塊,因為a被 thread1鎖定了。


轉載于:https://my.oschina.net/liangzhenghui/blog/187544

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Java多线程同步Synchronized深入解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。