java如何實現自定義鎖
阿新 • • 發佈:2018-11-30
不可重入鎖
public class MyLock implements Lock { private boolean isLocked = false; @Override public synchronized void lock() { while (isLocked){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } isLocked = true; } @Override public synchronized void unlock() { isLocked = false; notify(); } 其他的方法不用重寫 }
可重入鎖
public class MyLock implements Lock { private boolean isLocked = false; int lockCount = 0; Thread lockBy = null; @Override public synchronized void lock() { while (isLocked && lockBy != Thread.currentThread()){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } isLocked = true; lockBy = Thread.currentThread(); lockCount++; } @Override public synchronized void unlock() { if (lockBy == Thread.currentThread()){ lockCount--; if (lockCount == 0){ isLocked = false; notify(); } } }
區別
不可重入鎖獲取鎖的條件:1,鎖沒被獲取;2,是該執行緒的第一次獲取。
而可重入鎖獲取鎖的條件:1,鎖沒被獲取;2,是否是當前執行緒獲取的。
不可重入鎖關心的是鎖是否被一個執行緒獲取過,直接釋放鎖。
可重入鎖關心的是是否是當前執行緒獲取的,當lockCount為0時釋放。