[java基礎]一文理解java多線程必備的sychronized關鍵字,從此不再混淆!


java並發編程中最長用到的關鍵字就是synchronized了,這里講解一下這個關鍵字的用法和容易混淆的地方.
synchronized關鍵字涉及到鎖的概念, 在java中,synchronized鎖大家又通俗的稱為:方法鎖,對象鎖 和 類鎖 三種.

先上結論!

1 無論是修飾方法還是修飾代碼塊都是 對象鎖,當一個線程訪問一個帶synchronized方法時,由於對象鎖的存在,所有加synchronized的方法都不能被訪問(前提是在多個線程調用的是同一個對象實例中的方法)
2 無論是修飾靜態方法還是鎖定某個對象,都是 類鎖.一個class其中的靜態方法和靜態變量在內存中只會加載和初始化一份,所以,一旦一個靜態的方法被申明為synchronized,此類的所有的實例化對象在調用該方法時,共用同一把鎖,稱之為類鎖。

1 對象鎖的寫法一: 修飾方法:

synchronized修飾普通方法,鎖定的是當前對象.一次只能有一個線程進入同一個對象實例method()方法.
寫法如下:

2 對象鎖的寫法二:修飾代碼塊,鎖實例對象

3 類鎖的寫法一:修飾靜態方法

4 類鎖的寫法二:修飾代碼塊,鎖類對象

其實,類鎖修飾方法和代碼塊的效果和對象鎖是一樣的,因為類鎖只是一個抽象出來的概念,只是為了區別靜態方法的特點,因為靜態方法是所有對象實例共用的,所以對應着synchronized修飾的靜態方法的鎖也是唯一的,所以抽象出來個類鎖。

5 synchronized同時修飾靜態和非靜態方法

上面的synchronized同時修飾靜態方法和實例方法,結果交替運行,證明類鎖和對象鎖是兩個不同的鎖,控制不同的區域,互不干擾.

Tips:

1.synchronized關鍵字不能繼承。也就是說子類重寫了父類中用synchronized修飾的方法,子類的方法仍然不是同步的。

2.定義接口方法時,不能使用synchronized關鍵字。

3.構造方法不能使用synchronized關鍵字,但是可以使用synchronized代碼塊。


免責聲明!

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



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