java多執行緒(4)
阿新 • • 發佈:2018-11-10
ReentrantLock
- ReentrantLock 是重入鎖的意思,實現了Lock介面
- ReentrantLock 可以實現執行緒間的同步,用Condition實現執行緒間的通訊, synchronized 與 wait() 方法和 notify() 方式結合實現執行緒間通訊的時候,notify/notifyAll 的通知等待的執行緒時是隨機的,而condition可以實現選擇性通知
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockConditionDemo {
private Lock lock = new ReentrantLock();
private Condition conditionA = lock.newCondition();
private Condition conditionB = lock.newCondition();
public static void main(String[] args) throws InterruptedException {
LockConditionDemo demo = new LockConditionDemo();
new Thread(() -> demo.await(demo.conditionA), "thread1_conditionA").start();
new Thread(() -> demo.await(demo.conditionB), "thread2_conditionB").start();
new Thread(() -> demo.signal(demo.conditionB), "thread3_conditionB").start();
System .out.println("稍等5秒再通知其他的執行緒!");
Thread.sleep(5000);
new Thread(() -> demo.signal(demo.conditionA), "thread4_conditionA").start();
}
private void await(Condition condition) {
try {
lock.lock();
System.out.println("開始等待await! ThreadName:" + Thread.currentThread().getName());
condition.await();
System.out.println("等待await結束! ThreadName:" + Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
private void signal(Condition condition) {
lock.lock();
System.out.println("傳送通知signal! ThreadName:" + Thread.currentThread().getName());
condition.signal();
lock.unlock();
}
}
如上的例子,先通知conditionB,再通知conditionA
3.公平鎖和非公平鎖:公平鎖:先進先出。非公平鎖:隨機獲得鎖。
ReentrantLock 提供了一個構造方法,可以很簡單的實現公平鎖或非公平鎖
4.ReentrantReadWriteLock
ReentrantReadWriteLock 有兩個鎖:一個是與讀相關的鎖,稱為“共享鎖”;另一個是與寫相關的鎖,稱為“排它鎖”
讀讀共享;
寫寫互斥;
讀寫互斥;
寫讀互斥