您好,登錄后才能下訂單哦!
Java并發(fā)編程相關(guān)概念及注意事項是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
相應(yīng)的概念在Java中的具體表現(xiàn)形式,以及使用中要注意的一些問題。
在Java的并發(fā)編程中,synchronized
這個詞在初期一定會被大量的使用,除非開發(fā)者熟悉J.U.C
包中的相關(guān)工具類進(jìn)行替換。
這里synchronized
也被稱為隱式鎖、內(nèi)置鎖或管程鎖,這三個都是指同一個,看到的時候不必驚訝又出新概念了。這里的鎖似乎是看不到的,我們開發(fā)者只是通過關(guān)鍵詞進(jìn)行了使用,而不用關(guān)心鎖的獲取、釋放等細(xì)節(jié)。
而實(shí)質(zhì)上,隱式鎖,是通過在JVM指令層面,增加monitor enter 和exit相關(guān)的指令來實(shí)現(xiàn)。
例如下面的幾行代碼:
Object o = new Object();
public void test() {
synchronized(o) {
System.out.println(o);
}
}
轉(zhuǎn)換成的jvm指令如下,注意monitor指令
J.U.C
中的重入鎖、讀寫鎖等,相比較synchronized
,會需要開發(fā)者進(jìn)行顯式鎖的獲取,釋放等操作,而且兩者的實(shí)現(xiàn)形式也不同。根據(jù)使用場景,如果需要更細(xì)粒度的控制鎖,可以使用J.U.C
的實(shí)現(xiàn)。
Java并發(fā)編程中,另一個會經(jīng)常會用到且容易被用錯的,就數(shù)volatile
啦。
我們一般使用volatile
進(jìn)行一些重要標(biāo)識的設(shè)置及判斷,例如這樣
public static volatile boolean shutDown = false;
這種情況下,當(dāng)其他線程在修改標(biāo)識后,對于后面執(zhí)行的線程,能夠保證可見性。
而對于這樣類型的聲明,僅僅用volatile
就不能滿足:
public static volatile int count = 0;
如果此處,我們把count
用做計數(shù)器,對于每個線程的請求,進(jìn)行count++
。這種時候,結(jié)果并不會符合預(yù)期,除非我們又顯式的增加了鎖。
這是因為整個count++
,并不是一個整體,雖然其形式上看著像是不可分割的。但其實(shí)際上是由取值,加1,賦值這幾步構(gòu)成。多線程執(zhí)行時,容易造成錯亂,最終結(jié)果不符合預(yù)期。
用volatile
也是實(shí)現(xiàn)不了的安全的count++的,畢竟它的作用是抑制CPU進(jìn)行指令重排序,對于寫和讀都是實(shí)時獲取最新結(jié)果,不受JMM的影響。為了實(shí)現(xiàn)安全的計數(shù)或遞增,是需要鎖的介入,來保證整個count++的操作是互斥的,在整個臨界區(qū)內(nèi),一個線程對count的操作不受其它線程的影響。
此外,Java并發(fā)編程中,在使用synchronized
進(jìn)行鎖定時,需要注意的一個問題是:
在自己持有鎖之后,才能進(jìn)行鎖的
wait
和notify
。
否則你會遇到這個異常:
Exception in thread "main" java.lang.IllegalMonitorStateException
就像一個人高喊著要把他的面包給你,但是他手里只有空氣…,而你把口水吐到了他有臉上 :)
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。