更多内容请关注:

锁清秋
package fuxi.concurrency;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class ProducerConsumer {
public void prod() {
System.out.println("prod");
}
public void consume() {
System.out.println("consume");
}
}
public class ProducerConsumerTest {
private static Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
private AtomicBoolean flag = new AtomicBoolean(true);
public void ProductCustomerTest() {
new Thread(() -> {
ProducerConsumer producerConsumer = new ProducerConsumer();
for (int i = 0; i < 20; i++) {
synchronized (flag) {
while (!flag.get()) {
try {
flag.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
producerConsumer.prod();
flag.set(!flag.get());
flag.notifyAll();
}
}
}, "ProducerConsumerTest-1").start();
new Thread(() -> {
ProducerConsumer producerConsumer = new ProducerConsumer();
for (int i = 0; i < 20; i++) {
synchronized (flag) {
while (flag.get()) {
try {
flag.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
producerConsumer.consume();
flag.set(!flag.get());
flag.notifyAll();
}
}
}, "ProducerConsumerTest-2").start();
}
public void conditionTest() {
new Thread(() -> {
ProducerConsumer producerConsumer = new ProducerConsumer();
for (int i = 0; i < 20; i++) {
lock.lock();
try {
while (!flag.get()) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
producerConsumer.prod();
flag.set(!flag.get());
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}, "ProducerConsumerTest-1").start();
new Thread(() -> {
ProducerConsumer producerConsumer = new ProducerConsumer();
for (int i = 0; i < 20; i++) {
lock.lock();
try {
while (flag.get()) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
producerConsumer.consume();
flag.set(!flag.get());
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}, "ProducerConsumerTest-2").start();
}
public static void main(String[] args) {
ProducerConsumerTest producerConsumerTest = new ProducerConsumerTest();
producerConsumerTest.conditionTest();
}
}