Suppose we have a class:
public class Foo {
public void first() { print("first"); }
public void second() { print("second"); }
public void third() { print("third"); }
}
The same instance of Foo will be passed to three different threads. Thread A will call first(), thread B will call second(), and thread C will call third(). Design a mechanism and modify the program to ensure that second() is executed after first(), and third() is executed after second().
按顺序打印,多线程的一道题目。
使用 synchronized关键字:
class Foo {
public Foo() {
}
private int flag = 0;
public synchronized void first(Runnable printFirst) throws InterruptedException {
while (flag != 0) {
this.wait();
}
printFirst.run();
flag = 1;
this.notifyAll();
// printFirst.run() outputs "first". Do not change or remove this line.
}
public synchronized void second(Runnable printSecond) throws InterruptedException {
while (flag != 1) {
this.wait();
}
printSecond.run();
flag = 2;
this.notifyAll();
}
public synchronized void third(Runnable printThird) throws InterruptedException {
while (flag != 2) {
this.wait();
}
printThird.run();
flag = 0;
this.notifyAll();
}
}
使用Lock锁:
class Foo {
public Foo() {
}
private int flag = 0;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void first(Runnable printFirst) throws InterruptedException {
lock.lock();
try {
while (flag != 0) {
condition.await();
}
printFirst.run();
flag = 1;
condition.signalAll();
} finally {
lock.unlock();
}
}
public void second(Runnable printSecond) throws InterruptedException {
lock.lock();
try {
while (flag != 1) {
condition.await();
}
printSecond.run();
flag = 2;
condition.signalAll();
} finally {
lock.unlock();
}
}
public void third(Runnable printThird) throws InterruptedException {
lock.lock();
try {
while (flag != 2) {
condition.await();
}
printThird.run();
flag = 0;
condition.signalAll();
} finally {
lock.unlock();
}
}
}