Java并發(fā)編程相關(guān)概念及注意事項(xiàng)是什么,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
為企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站優(yōu)化、營(yíng)銷型網(wǎng)站、競(jìng)價(jià)托管、品牌運(yùn)營(yíng)等營(yíng)銷獲客服務(wù)。成都創(chuàng)新互聯(lián)擁有網(wǎng)絡(luò)營(yíng)銷運(yùn)營(yíng)團(tuán)隊(duì),以豐富的互聯(lián)網(wǎng)營(yíng)銷經(jīng)驗(yàn)助力企業(yè)精準(zhǔn)獲客,真正落地解決中小企業(yè)營(yíng)銷獲客難題,做到“讓獲客更簡(jiǎn)單”。自創(chuàng)立至今,成功用技術(shù)實(shí)力解決了企業(yè)“網(wǎng)站建設(shè)、網(wǎng)絡(luò)品牌塑造、網(wǎng)絡(luò)營(yíng)銷”三大難題,同時(shí)降低了營(yíng)銷成本,提高了有效客戶轉(zhuǎn)化率,獲得了眾多企業(yè)客戶的高度認(rèn)可!
相應(yīng)的概念在Java中的具體表現(xiàn)形式,以及使用中要注意的一些問題。
在Java的并發(fā)編程中,synchronized
這個(gè)詞在初期一定會(huì)被大量的使用,除非開發(fā)者熟悉J.U.C
包中的相關(guān)工具類進(jìn)行替換。
這里synchronized
也被稱為隱式鎖、內(nèi)置鎖或管程鎖,這三個(gè)都是指同一個(gè),看到的時(shí)候不必驚訝又出新概念了。這里的鎖似乎是看不到的,我們開發(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
,會(huì)需要開發(fā)者進(jìn)行顯式鎖的獲取,釋放等操作,而且兩者的實(shí)現(xiàn)形式也不同。根據(jù)使用場(chǎng)景,如果需要更細(xì)粒度的控制鎖,可以使用J.U.C
的實(shí)現(xiàn)。
Java并發(fā)編程中,另一個(gè)會(huì)經(jīng)常會(huì)用到且容易被用錯(cuò)的,就數(shù)volatile
啦。
我們一般使用volatile
進(jìn)行一些重要標(biāo)識(shí)的設(shè)置及判斷,例如這樣
public static volatile boolean shutDown = false;
這種情況下,當(dāng)其他線程在修改標(biāo)識(shí)后,對(duì)于后面執(zhí)行的線程,能夠保證可見性。
而對(duì)于這樣類型的聲明,僅僅用volatile
就不能滿足:
public static volatile int count = 0;
如果此處,我們把count
用做計(jì)數(shù)器,對(duì)于每個(gè)線程的請(qǐng)求,進(jìn)行count++
。這種時(shí)候,結(jié)果并不會(huì)符合預(yù)期,除非我們又顯式的增加了鎖。
這是因?yàn)檎麄€(gè)count++
,并不是一個(gè)整體,雖然其形式上看著像是不可分割的。但其實(shí)際上是由取值,加1,賦值這幾步構(gòu)成。多線程執(zhí)行時(shí),容易造成錯(cuò)亂,最終結(jié)果不符合預(yù)期。
用volatile
也是實(shí)現(xiàn)不了的安全的count++的,畢竟它的作用是抑制CPU進(jìn)行指令重排序,對(duì)于寫和讀都是實(shí)時(shí)獲取最新結(jié)果,不受JMM的影響。為了實(shí)現(xiàn)安全的計(jì)數(shù)或遞增,是需要鎖的介入,來保證整個(gè)count++的操作是互斥的,在整個(gè)臨界區(qū)內(nèi),一個(gè)線程對(duì)count的操作不受其它線程的影響。
此外,Java并發(fā)編程中,在使用synchronized
進(jìn)行鎖定時(shí),需要注意的一個(gè)問題是:
在自己持有鎖之后,才能進(jìn)行鎖的
wait
和notify
。
否則你會(huì)遇到這個(gè)異常:
Exception in thread "main" java.lang.IllegalMonitorStateException
就像一個(gè)人高喊著要把他的面包給你,但是他手里只有空氣…,而你把口水吐到了他有臉上 :)
看完上述內(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)的支持。