Java中synchronized關(guān)鍵字有什么作用,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、虛擬空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、渾源網(wǎng)站維護(hù)、網(wǎng)站推廣。
synchronized
synchronized可以用來(lái)同步塊,同步方法。同步塊可以用來(lái)更精確地控制對(duì)象鎖,控制鎖的作用域。(鎖的作用域就是從鎖的獲得到鎖的釋放的時(shí)間,而且可以選擇獲取哪個(gè)對(duì)象的鎖)。但是在使用同步塊機(jī)制時(shí),過(guò)多的使用鎖也會(huì)引發(fā)死鎖問(wèn)題,同時(shí)獲取和釋放也有代價(jià)。
而同步方法,它所擁有的就是該類(lèi)的對(duì)象,換句話(huà)說(shuō),就是this對(duì)象,而且鎖的作用域是整個(gè)方法,這可能導(dǎo)致鎖的作用域太大,有可能導(dǎo)致死鎖問(wèn)題。同時(shí)也可能包括了不需要同步的代碼塊在內(nèi),也會(huì)降低程序的運(yùn)行效率。
不管是同步方法還是同步塊,我們都不應(yīng)該在里面包含無(wú)限循環(huán),不然有可能導(dǎo)致獲得鎖之后,無(wú)限循環(huán)下去,無(wú)法釋放獲得的鎖資源,從而導(dǎo)致等待鎖的線(xiàn)程無(wú)法獲得,出現(xiàn)死鎖問(wèn)題。
同步方法
非靜態(tài)同步方法
所有的非靜態(tài)同步方法使用的都是同一把鎖----實(shí)例對(duì)象本身,也就是說(shuō)一個(gè)實(shí)例對(duì)象的非靜態(tài)方法獲得鎖之后,此對(duì)象的其他非靜態(tài)方法必須等待該方法釋放鎖之后才能獲取鎖,而這個(gè)類(lèi)的其他對(duì)象可以被獲取,其他對(duì)象的非靜態(tài)方法使用的是不同的鎖
靜態(tài)同步方法
所有的靜態(tài)同步方法使用的都是同一把鎖---該類(lèi)對(duì)象本身,這兩把鎖使用的是不同的對(duì)象,所以,類(lèi)的非靜態(tài)方法和靜態(tài)方法之間不存在鎖競(jìng)爭(zhēng)。但是一個(gè)類(lèi)的靜態(tài)方法之間存在鎖競(jìng)爭(zhēng),
同步塊
鎖是可以選擇的,所以只有存在同一把鎖的同步塊才存在鎖競(jìng)爭(zhēng),注意!同步塊的鎖是可以選擇的,但不是可以任意選擇的(使用一個(gè)引用對(duì)象的實(shí)例變量不是一個(gè)好的選擇,因?yàn)橥綁K在執(zhí)行過(guò)程中,可能會(huì)改變它的值,比如設(shè)置為null,而對(duì)一個(gè)null對(duì)象加鎖會(huì)發(fā)生異常,并且對(duì)不同的對(duì)象加鎖也違背了使用鎖的初衷)
同步是基于對(duì)象而不是基于引用的,多個(gè)變量可以引用一個(gè)對(duì)象,變量也可以改變引用的對(duì)象,因此,我們要根據(jù)實(shí)例對(duì)象而不是引用來(lái)考慮!作為一個(gè)原則!永遠(yuǎn)不要對(duì)一個(gè)可能再同步塊中改變其值的實(shí)例變量加鎖?。。?/p>
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。