同步關(guān)鍵字用于在多個(gè)線程中需要對(duì)同一段數(shù)據(jù)進(jìn)行訪問時(shí)候壳贪,出現(xiàn)的不安全情況。因?yàn)槎鄠€(gè)線程執(zhí)行同一段代碼會(huì)造成數(shù)據(jù)不安全,所以需要用synchronized來同步代碼。
修飾一個(gè)類
其作用的范圍是synchronized后面括號(hào)括起來的部分,作用的對(duì)象是這個(gè)類的所有對(duì)象殖卑,只要是這個(gè)類型的class不管有幾個(gè)對(duì)象都會(huì)起作用杠人。如下代碼
class ClassName {
public void method() {
synchronized(ClassName.class) {
// todo
}
}
}
修飾一個(gè)方法
synchronized 修飾一個(gè)方法很簡(jiǎn)單填帽,就是在方法的前面加synchronized砰粹,例如:
public synchronized void method()
{
// todo
}
在定義接口方法時(shí)不能使用synchronized關(guān)鍵字。
構(gòu)造方法不能使用synchronized關(guān)鍵字造挽,但可以使用synchronized代碼塊來進(jìn)行同步碱璃。
synchronized 關(guān)鍵字不能被繼承 ,如果要同步需要顯式的加上關(guān)鍵字饭入。
synchronized 關(guān)鍵字修飾的方法如果被重寫默認(rèn)不同步嵌器,如果要同步需要顯式的加上關(guān)鍵字,或者super父類的方法也就相當(dāng)于同步了谐丢。
修飾代碼塊
public void method()
{
synchronized(this)
synchronized(XX.class)
}
synchronized(this)鎖的是當(dāng)前對(duì)象爽航,當(dāng)前有幾個(gè)對(duì)象那么這個(gè)this就是有多份,這里的this只能鎖同一個(gè)對(duì)象。
synchronized(XX.class)只要是這個(gè)類型的class這把鎖就都有用
當(dāng)兩個(gè)并發(fā)線程訪問同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí)乾忱,一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行讥珍。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí)窄瘟,另一個(gè)線程仍然可以訪問該object中的非synchronized(this)同步代碼塊衷佃。尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí)蹄葱,其他線程對(duì)object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞氏义。
第三個(gè)例子同樣適用其它同步代碼塊。也就是說图云,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí)惯悠,它就獲得了這個(gè)object的對(duì)象鎖。結(jié)果竣况,其它線程對(duì)該object對(duì)象所有同步代碼部分的訪問都被暫時(shí)阻塞克婶。
以上規(guī)則對(duì)其它對(duì)象鎖同樣適用.
修飾靜態(tài)方法
我們知道 靜態(tài)方法是屬于類的而不屬于對(duì)象的 。同樣的丹泉, synchronized修飾的靜態(tài)方法鎖定的是這個(gè)類的所有對(duì)象鸠补,所有類用它都會(huì)有鎖的效果。
public synchronized static void method() {
// todo
}
總結(jié):
A. 無論synchronized關(guān)鍵字加在方法上還是對(duì)象上嘀掸,如果它作用的對(duì)象是非靜態(tài)的紫岩,則它取得的鎖是對(duì)象;如果synchronized作用的對(duì)象是一個(gè)靜態(tài)方法或一個(gè)類睬塌,則它取得的鎖是對(duì)類泉蝌,該類所有的對(duì)象同一把鎖歇万。
B. 每個(gè)對(duì)象只有一個(gè)鎖(lock)與之相關(guān)聯(lián),誰拿到這個(gè)鎖誰就可以運(yùn)行它所控制的那段代碼勋陪。
C. 實(shí)現(xiàn)同步是要很大的系統(tǒng)開銷作為代價(jià)的贪磺,甚至可能造成死鎖,所以盡量避免無謂的同步控制诅愚。
D.同步關(guān)鍵字鎖的是對(duì)象