簡(jiǎn)單了解Java synchronized關(guān)鍵字同步
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í)例變量加鎖!??!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Java使用Jsch與sftp服務(wù)器實(shí)現(xiàn)ssh免密登錄
這篇文章主要介紹了詳解Java使用Jsch與sftp服務(wù)器實(shí)現(xiàn)ssh免密登錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10分析java中全面的單例模式多種實(shí)現(xiàn)方式
單例模式是一種常用的軟件設(shè)計(jì)模式,單例對(duì)象的類(lèi)只能允許一個(gè)實(shí)例存在。許多時(shí)候整個(gè)系統(tǒng)只需要擁有一個(gè)的全局對(duì)象,有利于協(xié)調(diào)系統(tǒng)整體的行為。比如在某個(gè)服務(wù)器程序中,該服務(wù)器的配置信息存放在一個(gè)文件中。本文將介紹它的思想和多種實(shí)現(xiàn)方式2021-06-06java調(diào)用通義千問(wèn)API的詳細(xì)完整步驟
通義千問(wèn)是阿里云自主研發(fā)的大語(yǔ)言模型,能夠在用戶(hù)自然語(yǔ)言輸入的基礎(chǔ)上,通過(guò)自然語(yǔ)言理解和語(yǔ)義分析,理解用戶(hù)意圖,在不同領(lǐng)域、任務(wù)內(nèi)為用戶(hù)提供服務(wù)和幫助,下面這篇文章主要給大家介紹了關(guān)于java調(diào)用通義千問(wèn)API的詳細(xì)完整步驟,需要的朋友可以參考下2024-02-02SpringBoot2.x版本中,使用SpringSession踩的坑及解決
這篇文章主要介紹了SpringBoot2.x版本中,使用SpringSession踩的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Spring Boot修改內(nèi)置Tomcat默認(rèn)端口號(hào)的示例
本篇文章主要介紹了Spring Boot修改內(nèi)置Tomcat端口號(hào)的示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08淺談Java list.remove( )方法需要注意的兩個(gè)坑
這篇文章主要介紹了淺談Java list.remove( )方法需要注意的兩個(gè)坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12java中List接口與實(shí)現(xiàn)類(lèi)介紹
大家好,本篇文章主要講的是java中List接口與實(shí)現(xiàn)類(lèi)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽2021-12-12