1. 程式人生 > >java多執行緒(4)

java多執行緒(4)

ReentrantLock

  1. ReentrantLock 是重入鎖的意思,實現了Lock介面
  2. 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 有兩個鎖:一個是與讀相關的鎖,稱為“共享鎖”;另一個是與寫相關的鎖,稱為“排它鎖”
讀讀共享;
寫寫互斥;
讀寫互斥;
寫讀互斥