鎖-概念:可重入鎖、可中斷鎖、公平鎖、讀寫鎖
阿新 • • 發佈:2018-06-25
++ 重復 lse -- som HR read cep sync 可重入鎖
指的是在同一個thread中,獲取鎖之後再次使用同樣的方法或對象中的其他方法可以直接操作,而不需要重新獲取鎖。它是基於thread粒度的,per-thread。
不可重入鎖
指的是每次使用鎖方法時,都需要重新獲取鎖,即使在同一線程中調用同一方法都需要等待上一個鎖的釋放。它是基於method粒度的,per-invocation。
可重入鎖與不可重復鎖的例子
//設計一個鎖 public class Lock{ private boolean isLocked = false; public synchronized void lock() throws InterruptedException{ while(isLocked){ wait(); } isLocked = true; } public synchronized void unlock(){ isLocked = false; notify(); } } // 不可重入鎖 public class Count{ Lock lock = new Lock(); public void print(){ lock.lock(); doAdd(); lock.unlock(); } public void doAdd(){ lock.lock(); //do something lock.unlock(); } }
以上就是一個不可重入鎖。同一線程多次調用print()方法或則doAdd()方法都會阻塞。
// 可重入鎖 public class Lock{ boolean isLocked = false; Thread lockedBy = null; int lockedCount = 0; public synchronized void lock() throws InterruptedException{ Thread thread = Thread.currentThread(); while(isLocked && lockedBy != thread){ wait(); } isLocked = true; lockedCount++; lockedBy = thread; } public synchronized void unlock(){ if(Thread.currentThread() == this.lockedBy){ lockedCount--; if(lockedCount == 0){ isLocked = false; notify(); } } } }
以上就是一個可重入鎖。只要是同一個thread獲取對應的鎖之後就可以重復的調用對應的方法,而不需要再次獲取鎖。
可中斷鎖
在等待獲取鎖過程中可中斷。註意是在等待鎖過程中才可以中斷,如果已經獲取了鎖,中斷就無效。
公平鎖
按等待獲取鎖的線程的等待時間進行獲取,等待時間長的具有優先獲取鎖權利。即按先後順序來持有鎖。
讀寫鎖
對資源讀取和寫入的時候拆分為2部分處理,讀的時候可以多線程一起讀,寫的時候必須同步地寫。如:ReentrantReadWriteLock.
鎖-概念:可重入鎖、可中斷鎖、公平鎖、讀寫鎖