试题一
题目:
/** * Created by fan on 2019/11/4. * <p> * 三个线程A,B,C * A打印AA 5次 * B打印BB 10 次 * C打印CC 15 次 * <p> * A->B->C依次打印 * 轮询 10 次 */
实现
public class LockChangeSynchonized { public static void main(String[] args) throws Exception { Resource resource = new Resource(); Lock lock = new ReentrantLock(); Condition conditionA = lock.newCondition(); Condition conditionB = lock.newCondition(); Condition conditionC = lock.newCondition(); new Thread(() -> { lock.lock(); try { for (int i = 0; i < 10; i++) { while (resource.getFlag() != 1) { conditionA.await(); } resource.print(5, "AA"); resource.setFlag(2); conditionB.signal(); } } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } }, "A").start(); new Thread(() -> { lock.lock(); try { for (int i = 0; i < 10; i++) { while (resource.getFlag() != 2) { conditionB.await(); } resource.print(10, "BB"); resource.setFlag(3); conditionC.signal(); } } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } }, "B").start(); new Thread(() -> { lock.lock(); try { for (int i = 0; i < 10; i++) { while (resource.getFlag() != 3) { conditionC.await(); } resource.print(15, "CC"); resource.setFlag(1); conditionA.signal(); } } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } }, "C").start(); } } class Resource { private int flag = 1; public int getFlag() { return flag; } public void setFlag(int flag) { this.flag = flag; } public void print(int count, String content) { for (int i = 0; i < count; i++) { System.out.println(Thread.currentThread().getName() + "\t" + content + "\t" + (i + 1)); } } }