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代碼
|
這種情況下,是實現代碼塊鎖定,鎖定的對象是 變量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深入解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言线性表库函数大全,数据结构(C语言
- 下一篇: python格式化字符串%r_Pytho