package com.demo.test;/**
* åºäºä¸¤ä¸ªlockå®ç°è¿ç»æå°abcabc....
* @author lixiaoxi
* */public class TwoLockPrinter implements Runnable { // æå°æ¬¡æ°
private static final int PRINT_COUNT = 10; // åä¸ä¸ªçº¿ç¨çæå°é
private final Object fontLock; // æ¬çº¿ç¨çæå°é
private final Object thisLock; // æå°å符
private final char printChar; public TwoLockPrinter(Object fontLock, Object thisLock, char printChar) { this.fontLock = fontLock; this.thisLock = thisLock; this.printChar = printChar;
}
@Override public void run() { // è¿ç»æå°PRINT_COUNT次
for (int i = 0; i < PRINT_COUNT; i++) { // è·ååä¸ä¸ªçº¿ç¨çæå°é
synchronized (fontLock) { // è·åæ¬çº¿ç¨çæå°é
synchronized (thisLock) { //æå°å符 System.out.print(printChar); // éè¿æ¬çº¿ç¨çæå°éå¤éåé¢ç线ç¨
// notifyånotifyallåå¯,å 为åä¸æ¶å»åªæä¸ä¸ªçº¿ç¨å¨çå¾
thisLock.notify();
} // ä¸æ¯æåä¸æ¬¡åéè¿fontLockçå¾
被å¤é // å¿
é¡»è¦å å¤æï¼ä¸ç¶è½ç¶è½å¤æå°10次ï¼ä½10次åå°±ä¼ç´æ¥æ»é
if(i < PRINT_COUNT - 1){ try { // éè¿fontLockçå¾
被å¤é fontLock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
} public static void main(String[] args) throws InterruptedException { // æå°A线ç¨çé
Object lockA = new Object(); // æå°B线ç¨çé
Object lockB = new Object(); // æå°C线ç¨çé
Object lockC = new Object();
// æå°aç线ç¨
Thread threadA = new Thread(new TwoLockPrinter(lockC, lockA, 'A')); // æå°bç线ç¨
Thread threadB = new Thread(new TwoLockPrinter(lockA, lockB, 'B')); // æå°cç线ç¨
Thread threadC = new Thread(new TwoLockPrinter(lockB, lockC, 'C')); // ä¾æ¬¡å¼å¯a b cçº¿ç¨ threadA.start();
Thread.sleep(100); // ç¡®ä¿æ顺åºAãBãCæ§è¡ threadB.start();
Thread.sleep(100);
threadC.start();
Thread.sleep(100);
}
}
温馨提示:答案为网友推荐,仅供参考