/** * 方案一 * * @author LY */ public class LockObject { public String lockName; public LockObject() { } public LockObject(String lockName) { this.lockName = lockName; } public String getLockName() { return lockName; } public void setLockName(String lockName) { this.lockName = lockName; } } public class MyThread implements Runnable { private String name; private String next; private LockObject lock; MyThread(String name, String next, LockObject lock) { this.name = name; this.next = next; this.lock = lock; } /** * 三个线程同时启动: * 1.new Thread(new MyThread("A", "B", data)).start(); * 2.new Thread(new MyThread("B", "C", data)).start(); * 3.new Thread(new MyThread("C", "A", data)).start(); * 同时进入循环: * 前面Data data = new Data("A"); * 所以data=A * 第一个线程满足条件,进入同步方法:打印A,设置data=B,count=2 * 第二个线程不满足条件,进入无限循环,count=3 * 第三个线程不满足条件,进入无限循环,count=3 * data=B * 第二个线程满足条件,进入同步方法:打印B,设置data=C,count=2 * 第一个线程不满足条件,进入无限循环,count=2 * 第三个线程不满足条件,进入无限循环,count=3 * data=C * 第三个线程满足条件,进入同步方法:打印C,设置data=A,count=2 * 第一个线程不满足条件,进入无限循环,count=2 * 第二个线程不满足条件,进入无限循环,count=2 * * 当再次data=A * 从第一个线程开始,三个线程依次符合条件再跑一次,count=1 * * 打印结果:ABCABCABC */ public void run() { int count = 3; while (count > 0) { if (lock.getLockName().equals(name)){ synchronized (lock) { System.out.print(name); lock.setLockName(next); count--; } } } } public static void main(String[] args) throws InterruptedException { LockObject data = new LockObject("A"); new Thread(new MyThread("A", "B", data)).start(); new Thread(new MyThread("B", "C", data)).start(); new Thread(new MyThread("C", "A", data)).start(); } }
时间: 2024-11-17 06:02:34