java鎖的使用 java怎么避免死鎖?
java怎么避免死鎖?1、盡量在用tryLock(halftimeout,TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),設(shè)置中連接失敗
java怎么避免死鎖?
1、盡量在用tryLock(halftimeout,TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),設(shè)置中連接失敗時間,超時可以逃離如何防止死鎖。
2、最好不要在用(jdk1.5以上)包的并發(fā)類不用打印壓制并發(fā),也很常用的是ConcurrentHashMap、ConcurrentLinkedQueue、AtomicBoolean等等,實(shí)際應(yīng)用中中十分用處,簡單點(diǎn)方便些且效率比在用Lock更高。
3、盡量減少鎖的使用粒度,盡量不要幾個功能用同一把鎖。
4、最好不要下降不同步的的代碼塊。
百度搜索圈T社區(qū)付費(fèi)行業(yè)視頻教程
Java并發(fā)線程如何阻塞和喚醒?
每個對象都是兩個方法wait和notify,加上同步
Java并發(fā)線程的阻塞和再喚醒可分幾類:
基于條件JVM的對象頭來實(shí)現(xiàn)方法,多線程爭搶同一個臨界資源時據(jù)完全不同的鎖機(jī)制(自旋鎖、輕/最重量級鎖)來并且堵塞和沉睡。
,yeild等基礎(chǔ)機(jī)制這里暫時不輕輕略過,大體實(shí)現(xiàn)方法原理是實(shí)現(xiàn)對象的網(wǎng)絡(luò)同步隊(duì)列和后面的AQS很像。
3.并發(fā)組件的基礎(chǔ)AQS重點(diǎn)說下AQS(AbstractQueuedSynchronizer),
只不過這是jdk并工程分包實(shí)現(xiàn)方法的基礎(chǔ)(如Lock、BlockingQueue、CountdownLatch等)。
Aqs基本上由一個volatile變量state和個再等待隊(duì)列來實(shí)現(xiàn)方法,搶鎖時先CAS直接修改state,失敗的可能以后就弄到等待隊(duì)列里,并通過LockSupport將線程掛起。
當(dāng)鎖的擁有者釋放鎖時會實(shí)際LockSupport再喚醒耐心的等待隊(duì)列的情報營節(jié)點(diǎn),讓它再次去嘗試搶鎖(CAS如何修改state),如此反復(fù)。
手中掌握AQS的原理對再理解jdk里很多并發(fā)組件太有幫助。
()方法:以毫秒為單位,使線程進(jìn)入阻塞狀態(tài),時間到了過后,自動啟動再喚醒。
()和resume()方法:掛著和驅(qū)散線程,suspende()使線程直接進(jìn)入堵塞狀態(tài),只有隨機(jī)的resumee()被全局函數(shù)的時候,線程才會直接進(jìn)入可先執(zhí)行狀態(tài)。這個不建議您可以使用,太容易不可能發(fā)生死鎖情況。
3.yield()方法:動態(tài)創(chuàng)建yield()的效果等價于指揮和調(diào)度程序其實(shí)該線程已負(fù)責(zé)執(zhí)行了足夠的時間最大限度地轉(zhuǎn)回另一個線程
這里就說這三種吧,其它的你可以不去csdn上門看看,去學(xué)習(xí)再看看