您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關java中ReentrantLock的作用是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
ReentrantLock稱為重入鎖,比內(nèi)部鎖synchonized擁有更強大的功能,它可中斷、可定時、設置公平鎖
【注】使用ReentrantLock時,一定要釋放鎖,一般釋放放到finnal里寫。
提供以下重要的方法
lock():獲得鎖,如果鎖已被占用,則等待
lockInterruptibly():獲得鎖,但有限響應中斷
unlock():釋放鎖
tryLock():嘗試獲取鎖。如果獲得,返回true;否則返回false
tryLock(long time, TimeUnit unit):在給定時間內(nèi)獲得鎖。如果獲得返回true;否則返回false
示例
例子1
import java.util.concurrent.locks.ReentrantLock; public class ReentrantLockTest { ReentrantLock lock; ReentrantLockTest(ReentrantLock lock) { this.lock = lock; } private Runnable getRunnable() { return new Runnable() { @Override public void run() { while(true) { try { if (lock.tryLock()) { try { System.out.println("Locked:" + Thread.currentThread().getName()); Thread.sleep(800); } finally { lock.unlock(); System.out.println("UnLocked:" + Thread.currentThread().getName()); } System.out.println("break before"); break; } else { //System.out.println("Unable to lock " + Thread.currentThread().getName()); } } catch (InterruptedException e){ System.out.println(Thread.currentThread() + " is Interupted"); e.printStackTrace(); } } } }; } public static void main(String[] args) { ReentrantLock lock = new ReentrantLock(); ReentrantLockTest test = new ReentrantLockTest(lock); ReentrantLockTest test2 = new ReentrantLockTest(lock); Thread thread1 = new Thread(test.getRunnable(), "firstThread"); Thread thread2 = new Thread(test2.getRunnable(), "secondThread"); thread1.start(); thread2.start(); try { Thread.sleep(300); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println("interupt begin"); thread2.interrupt(); System.out.println("interupt end"); } }
一次執(zhí)行結(jié)果:
Locked:firstThread
interupt begin
interupt end
UnLocked:firstThread
break before
Locked:secondThread
UnLocked:secondThread
Thread[secondThread,5,main] is Interupted
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.jihite.templet.JavaBase.ReentrantLockTest$1.run(ReentrantLockTest.java:23)
at java.lang.Thread.run(Thread.java:748)
Locked:secondThread
UnLocked:secondThread
break before
分析:firstThread執(zhí)行,secondThread不停的判斷是否可以獲得鎖,當firstThread執(zhí)行完,secondThread執(zhí)行后被打斷
例子2
import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; public class ReentrantLockTest { ReentrantLock lock; ReentrantLockTest(ReentrantLock lock) { this.lock = lock; } private Runnable getRunnable() { return new Runnable() { @Override public void run() { while(true) { try { if (lock.tryLock(700, TimeUnit.MILLISECONDS)) { try { System.out.println("Locked:" + Thread.currentThread().getName()); Thread.sleep(800); } finally { lock.unlock(); System.out.println("UnLocked:" + Thread.currentThread().getName()); } System.out.println("break before"); break; } else { //System.out.println("Unable to lock " + Thread.currentThread().getName()); } } catch (InterruptedException e){ System.out.println(Thread.currentThread() + " is Interupted"); e.printStackTrace(); } } } }; } public static void main(String[] args) { ReentrantLock lock = new ReentrantLock(); ReentrantLockTest test = new ReentrantLockTest(lock); ReentrantLockTest test2 = new ReentrantLockTest(lock); Thread thread1 = new Thread(test.getRunnable(), "firstThread"); Thread thread2 = new Thread(test2.getRunnable(), "secondThread"); thread1.start(); thread2.start(); try { Thread.sleep(300); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println("interupt begin"); thread2.interrupt(); System.out.println("interupt end"); } }
一次執(zhí)行結(jié)果
Locked:firstThread
interupt begin
interupt end
Thread[secondThread,5,main] is Interupted
java.lang.InterruptedException
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireNanos(AbstractQueuedSynchronizer.java:936)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireNanos(AbstractQueuedSynchronizer.java:1247)
at java.util.concurrent.locks.ReentrantLock.tryLock(ReentrantLock.java:442)
at com.jihite.templet.JavaBase.ReentrantLockTest$1.run(ReentrantLockTest.java:19)
at java.lang.Thread.run(Thread.java:748)
Locked:secondThread
UnLocked:firstThread
break before
UnLocked:secondThread
break before
分析:firstThread執(zhí)行,secondThread等待,等待過程被打斷。打斷后firstThread執(zhí)行結(jié)束了,secondThread得到鎖,繼續(xù)執(zhí)行
例子3
import java.util.concurrent.locks.ReentrantLock; public class ReentrantLockTest2 { ReentrantLock lock; ReentrantLockTest2(ReentrantLock lock) { this.lock = lock; } private Runnable getRunnable() { return new Runnable() { @Override public void run() { while (true) { try { try { lock.lock(); // lock.lockInterruptibly(); System.out.println("Locked:" + Thread.currentThread().getName()); Thread.sleep(800); break; } finally { lock.unlock(); System.out.println("UnLocked:" + Thread.currentThread().getName()); } } catch (InterruptedException e) { e.printStackTrace(); } } } }; } public static void main(String[] args) { ReentrantLock lock = new ReentrantLock(); ReentrantLockTest2 test = new ReentrantLockTest2(lock); ReentrantLockTest2 test2 = new ReentrantLockTest2(lock); Thread thread1 = new Thread(test.getRunnable(), "firstThread"); Thread thread2 = new Thread(test2.getRunnable(), "secondThread"); thread1.start(); thread2.start(); try { Thread.sleep(600); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println("interupt begin"); thread2.interrupt(); System.out.println("interupt end"); } }
一次執(zhí)行結(jié)果
Locked:firstThread
interupt begin
interupt end
UnLocked:firstThread
Locked:secondThread
UnLocked:secondThread
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.jihite.templet.JavaBase.ReentrantLockTest2$1.run(ReentrantLockTest2.java:22)
at java.lang.Thread.run(Thread.java:748)
Locked:secondThread
UnLocked:secondThread
分析:firstThread先獲得鎖執(zhí)行,secondThread在等待,此時中斷并未打斷等待。firstThread執(zhí)行完,secondThread獲取后被打斷
例子4
public class ReentrantLockTest2 { ReentrantLock lock; ReentrantLockTest2(ReentrantLock lock) { this.lock = lock; } private Runnable getRunnable() { return new Runnable() { @Override public void run() { while (true) { try { try { // lock.lock(); lock.lockInterruptibly(); System.out.println("Locked:" + Thread.currentThread().getName()); Thread.sleep(800); break; } finally { lock.unlock(); System.out.println("UnLocked:" + Thread.currentThread().getName()); } } catch (InterruptedException e) { e.printStackTrace(); } } } }; } public static void main(String[] args) { ReentrantLock lock = new ReentrantLock(); ReentrantLockTest2 test = new ReentrantLockTest2(lock); ReentrantLockTest2 test2 = new ReentrantLockTest2(lock); Thread thread1 = new Thread(test.getRunnable(), "firstThread"); Thread thread2 = new Thread(test2.getRunnable(), "secondThread"); thread1.start(); thread2.start(); try { Thread.sleep(600); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println("interupt begin"); thread2.interrupt(); System.out.println("interupt end"); } }
一次執(zhí)行結(jié)果
Locked:firstThread
interupt begin
interupt end
Exception in thread "secondThread" java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:151)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1261)
at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:457)
at com.jihite.templet.JavaBase.ReentrantLockTest2$1.run(ReentrantLockTest2.java:25)
at java.lang.Thread.run(Thread.java:748)
看完上述內(nèi)容,你們對java中ReentrantLock的作用是什么有進一步的了解嗎?如果還想了解更多知識或者相關內(nèi)容,請關注億速云行業(yè)資訊頻道,感謝大家的支持。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。