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