同步控制 之“重入锁”
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
????我們首先將介紹synchronized、Object.wait()和Object.notify()方法的替代品(或者說是增強(qiáng)版) ——重入鎖。
一、synchronized的功能擴(kuò)展:重入鎖
????重入鎖可以完全替代synchronized關(guān)鍵字。在JDK5.0的早期版本中,重入鎖的性能遠(yuǎn)遠(yuǎn)好于synchronized,但從JDK6.0開始,JDK在synchronized上做了大量的優(yōu)化,是的兩者的性能差距并不大。重入鎖使用java.util.concurrent.locks.ReentrantLock類來實(shí)現(xiàn)。下面是一段最簡單的重入鎖使用案例:
import java.util.concurrent.locks.ReentrantLock;public class Thread2 implements Runnable{public static ReentrantLock lock = new ReentrantLock();public static int i=0;@Overridepublic void run() {for (int j = 0; j < 1000000; j++) {lock.lock();try {i++;}finally {lock.unlock();}}}public static void main(String[] args) throws InterruptedException {Thread2 rl = new Thread2();//類名Thread t1 = new Thread(rl);Thread t2 = new Thread(rl);t1.start();t2.start();//啟動子線程t1、t2t1.join();t2.join();//結(jié)束子線程t1、t2System.out.println(i);} }????根據(jù)以上代碼,使用重入鎖保護(hù)臨界區(qū)資源i,確保多線程對i操作的安全性。從這段代碼可以看到,與synchronized相比,重入鎖有著顯示的操作過程。開發(fā)人員必須手動何時(shí)枷鎖,何時(shí)釋放鎖。也正因?yàn)檫@樣,重入鎖對邏輯控制的靈活性要遠(yuǎn)遠(yuǎn)好于synchronized,但值得注意的是,在退出臨界區(qū)時(shí),必須記得釋放,否則,其它線程就沒有機(jī)會再訪問臨界區(qū)了。
for (int j = 0; j < 1000000; j++) {lock.lock();lock.lock();try {i++;}finally {lock.unlock();lock.unlock();} }????一個(gè)線程連續(xù)兩次獲得同一把鎖。這是允許的!如果不允許這么操作,那么同一個(gè)線程在第2次獲得鎖時(shí),將會和自己產(chǎn)生死鎖。程序就會“卡死”在第2次申請鎖的過程中。需要注意的是,如果同一個(gè)線程多次獲得鎖,那么在釋放鎖的時(shí)候,也必須釋放相同次數(shù)。
- 釋放鎖的次數(shù)多了:會得到一個(gè)java.lang.IllegalMonitorStateException異常。
- 釋放鎖的次數(shù)少了:相當(dāng)于線程還持有這個(gè)鎖,因此其它線程也無法進(jìn)入臨界區(qū)。
?
轉(zhuǎn)載于:https://my.oschina.net/Clarences/blog/1547677
總結(jié)
以上是生活随笔為你收集整理的同步控制 之“重入锁”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CODE FESTIVAL 2017 q
- 下一篇: 《ARP的学习》