国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Lock和synchronized的區(qū)別

2019-11-11 04:00:29
字體:
供稿:網(wǎng)友

1、ReentrantLock 擁有Synchronized相同的并發(fā)性和內(nèi)存語義,此外還多了 鎖投票,定時鎖等候和中斷鎖等候線程A和B都要獲取對象O的鎖定,假設(shè)A獲取了對象O鎖,B將等待A釋放對O的鎖定,如果使用 synchronized ,如果A不釋放,B將一直等下去,不能被中斷如果 使用ReentrantLock,如果A不釋放,可以使B在等待了足夠長的時間以后,中斷等待,而干別的事情ReentrantLock獲取鎖定與三種方式:a) lock(), 如果獲取了鎖立即返回,如果別的線程持有鎖,當(dāng)前線程則一直處于休眠狀態(tài),直到獲取鎖b) tryLock(), 如果獲取了鎖立即返回true,如果別的線程正持有鎖,立即返回false;c)tryLock(long timeout,TimeUnit unit), 如果獲取了鎖定立即返回true,如果別的線程正持有鎖,會等待參數(shù)給定的時間,在等待的過程中,如果獲取了鎖定,就返回true,如果等待超時,返回false;d) lockInterruptibly:如果獲取了鎖定立即返回,如果沒有獲取鎖定,當(dāng)前線程處于休眠狀態(tài),直到或者鎖定,或者當(dāng)前線程被別的線程中斷2、synchronized是在JVM層面上實現(xiàn)的,不但可以通過一些監(jiān)控工具監(jiān)控synchronized的鎖定,而且在代碼執(zhí)行時出現(xiàn)異常,JVM會自動釋放鎖定,但是使用Lock則不行,lock是通過代碼實現(xiàn)的,要保證鎖定一定會被釋放,就必須將unLock()放到finally{}中3、在資源競爭不是很激烈的情況下,Synchronized的性能要優(yōu)于ReetrantLock,但是在資源競爭很激烈的情況下,Synchronized的性能會下降幾十倍,但是ReetrantLock的性能能維持常態(tài);

5.0的多線程任務(wù)包對于同步的性能方面有了很大的改進(jìn),在原有synchronized關(guān)鍵字的基礎(chǔ)上,又增加了ReentrantLock,以及各種Atomic類。了解其性能的優(yōu)劣程度,有助與我們在特定的情形下做出正確的選擇。

總體的結(jié)論先擺出來:

synchronized: 在資源競爭不是很激烈的情況下,偶爾會有同步的情形下,synchronized是很合適的。原因在于,編譯程序通常會盡可能的進(jìn)行優(yōu)化synchronize,另外可讀性非常好,不管用沒用過5.0多線程包的程序員都能理解。

ReentrantLock: ReentrantLock提供了多樣化的同步,比如有時間限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。在資源競爭不激烈的情形下,性能稍微比synchronized差點點。但是當(dāng)同步非常激烈的時候,synchronized的性能一下子能下降好幾十倍。而ReentrantLock確還能維持常態(tài)。

Atomic: 和上面的類似,不激烈情況下,性能比synchronized略遜,而激烈的時候,也能維持常態(tài)。激烈的時候,Atomic的性能會優(yōu)于ReentrantLock一倍左右。但是其有一個缺點,就是只能同步一個值,一段代碼中只能出現(xiàn)一個Atomic的變量,多于一個同步無效。因為他不能在多個Atomic之間同步。

所以,我們寫同步的時候,優(yōu)先考慮synchronized,如果有特殊需要,再進(jìn)一步優(yōu)化。ReentrantLock和Atomic如果用的不好,不僅不能提高性能,還可能帶來災(zāi)難。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 松江区| 什邡市| 藁城市| 黄大仙区| 泊头市| 北碚区| 乐东| 浦北县| 古田县| 安仁县| 林芝县| 阳原县| 宁德市| 宁夏| 抚宁县| 同心县| 泸州市| 修武县| 方正县| 六枝特区| 河南省| 蛟河市| 荣昌县| 尼玛县| 景宁| 克东县| 临西县| 天津市| 景谷| 秦安县| 疏附县| 北海市| 玉环县| 县级市| 基隆市| 泰兴市| 云梦县| 锦屏县| 隆林| 哈巴河县| 建平县|