多執行緒基礎5 Lock 鎖
阿新 • • 發佈:2018-11-09
1.同步 * 使用ReentrantLock類的lock()和unlock()方法進行同步
2.通訊 * 使用ReentrantLock類的newCondition()方法可以獲取Condition物件 * 需要等待的時候使用Condition的await()方法, 喚醒的時候用signal()方法 * 不同的執行緒使用不同的Condition, 這樣就能區分喚醒的時候找哪個執行緒了
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class Demo3_ReentrantLock { /** * @param args */ public static void main(String[] args) { final Printer3 p = new Printer3(); new Thread() { public void run() { while(true) { try { p.print1(); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); new Thread() { public void run() { while(true) { try { p.print2(); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); new Thread() { public void run() { while(true) { try { p.print3(); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } } class Printer3 { private ReentrantLock r = new ReentrantLock(); private Condition c1 = r.newCondition(); private Condition c2 = r.newCondition(); private Condition c3 = r.newCondition(); private int flag = 1; public void print1() throws InterruptedException { r.lock(); //獲取鎖 if(flag != 1) { c1.await(); } System.out.print("黑"); System.out.print("\r\n"); flag = 2; //this.notify(); //隨機喚醒單個等待的執行緒 c2.signal(); r.unlock(); //釋放鎖 } public void print2() throws InterruptedException { r.lock(); if(flag != 2) { c2.await(); } System.out.print("客"); System.out.print("\r\n"); flag = 3; //this.notify(); c3.signal(); r.unlock(); } public void print3() throws InterruptedException { r.lock(); if(flag != 3) { c3.await(); } System.out.print("hk"); System.out.print("\r\n"); flag = 1; c1.signal(); r.unlock(); } }