Java中Synchronized和Static?Synchronized的區(qū)別及說明
Synchronized和Static Synchronized的區(qū)別
synchronized 是對類的當前實例進行加鎖,防止其他線程同時訪問該類的該實例的所有synchronized塊,注意這里是 “類的當前實例” , 類的兩個不同實例就沒有這種約束了。
那么 static synchronized 恰好就是要控制類的所有實例的訪問了, static synchronized 是限制線程同時訪問jvm中該類的所有實例同時訪問對應的代碼塊。
一個日本作者-結(jié)成浩的《java多線程設計模式》
一個列子
pulbic class Something(){
public synchronized void isSyncA(){}
public synchronized void isSyncB(){}
public static synchronized void cSyncA(){}
public static synchronized void cSyncB(){}那么,加入有Something類的兩個實例a與b
下列組方法何以被1個以上線程同時訪問呢
a. x.isSyncA()與x.isSyncB() b. x.isSyncA()與y.isSyncA() c. x.cSyncA()與y.cSyncB() d. x.isSyncA()與Something.cSyncA()
- a . 都是對同一個實例的synchronized域訪問,因此不能被同時訪問
- b . 是針對不同實例的,因此可以同時被訪問
- c . 因為是
static synchronized,所以不同實例之間仍然會被限制,相當于Something.isSyncA()與Something.isSyncB()了,因此不能被同時訪問。 - d . 可以被同時訪問的,理由是synchronzied的是實例方法與synchronzied的類方法由于鎖定(lock)不同的原因。
說下結(jié)論:
- A: synchronized static是某個類的范圍,synchronized static cSync{}防止多個線程同時訪問這個 類中的synchronized static 方法。它可以對類的所有對象實例起作用。
- B: synchronized 是某實例的范圍,synchronized isSync(){}防止多個線程同時訪問這個實例中的synchronized 方法。
總結(jié)
有如下幾點:
- 對象鎖鑰匙只能有一把才能互斥,才能保證共享變量的唯一性
- 在靜態(tài)方法上的鎖,和 實例方法上的鎖,默認不是同樣的,如果同步需要制定兩把鎖一樣。
- 關(guān)于同一個類的方法上的鎖,來自于調(diào)用該方法的對象,如果調(diào)用該方法的對象是相同的,那么鎖必然相同,否則就不相同。比如
new A().x()和new A().x(),對象不同,鎖不同,如果A的單利的,就能互斥。 - 靜態(tài)方法加鎖,能和所有其他靜態(tài)方法加鎖的 進行互斥。
- 靜態(tài)方法加鎖,和xx.class 鎖效果一樣,直接屬于類的。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中Executor和Executors的區(qū)別小結(jié)
在Java并發(fā)編程中,Executor是一個核心接口,提供了任務執(zhí)行的抽象方法,而Executors是一個工具類,提供了創(chuàng)建各種線程池的工廠方法,Executor關(guān)注任務的執(zhí)行,而Executors關(guān)注如何創(chuàng)建適合的執(zhí)行器,感興趣的可以了解一下2024-10-10
SpringMVC整合SSM實現(xiàn)表現(xiàn)層數(shù)據(jù)封裝詳解
這篇文章主要介紹了SpringMVC整合SSM實現(xiàn)表現(xiàn)層數(shù)據(jù)封裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-10-10
Java用Arrays.asList初始化ArrayList實例方法
在本篇文章里小編給大家分享的是關(guān)于Java中使用Arrays.asList初始化ArrayList的知識點內(nèi)容,需要的朋友們參考下。2019-10-10
windows 32位eclipse遠程hadoop開發(fā)環(huán)境搭建
這篇文章主要介紹了windows 32位eclipse遠程hadoop開發(fā)環(huán)境搭建的相關(guān)資料,需要的朋友可以參考下2016-07-07
SpringBoot和前端聯(lián)動實現(xiàn)存儲瀏覽記錄功能
這篇文章主要介紹了SpringBoot和前端聯(lián)動實現(xiàn)存儲瀏覽記錄功能,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01

