2个窗口交替出售一张票,控制台可能会因为异步打印的原因出现连续打印一个窗口的票,但是票的奇偶肯定固定在一个窗口出售
package com.rejoice.concurrency;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class AwaitAndSignal {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Seller1(ticket).start();
new Seller2(ticket).start();
}
static class Ticket{
public Integer count = 1000;
public Boolean isSeller1 = true;
public ReentrantLock lock = new ReentrantLock();
public Condition condition = lock.newCondition();
}
static class Seller2 extends Thread{
private Ticket ticket;
Seller2(Ticket ticket){
this.ticket = ticket;
}
@Override
public void run() {
while(ticket.count > 0) {
try {
ticket.lock.lock();
if(ticket.isSeller1) {
try {
ticket.condition.await();
} catch (InterruptedException e) {
}
}
if(ticket.count <= 0) {
continue;
}
System.err.println("窗口2售第【 "+ticket.count+" 】张票");
ticket.count--;
ticket.isSeller1=true;
ticket.condition.signal();
} finally {
ticket.lock.unlock();
}
}
}
}
static class Seller1 extends Thread{
private Ticket ticket;
Seller1(Ticket ticket){
this.ticket = ticket;
}
@Override
public void run() {
while(ticket.count > 0) {
try {
ticket.lock.lock();
if(!ticket.isSeller1) {
try {
ticket.condition.await();
} catch (InterruptedException e) {
}
}
if(ticket.count <= 0) {
continue;
}
System.out.println("窗口1售第【 "+ticket.count+" 】张票");
ticket.count--;
ticket.isSeller1=false;
ticket.condition.signal();
} finally {
ticket.lock.unlock();
}
}
}
}
}
运行结果

Lock对象和synchronize关键字的区别
Lock对象可以灵活控制上锁和释放锁,synchronize是有jdk底层控制
网友评论