前情提示:一共有三个窗口,共卖100张票。
package piao;
/**
* className:Thread
* Package:piao
* Description:
*
* @Date:2019/12/3 9:29
* @Author:cc
*/
public class Ticket implements Runnable {
//将票数用static修饰,使得两线程在竞争售票的过程中,共享车票
public static int sum = 100;
@Override
public void run() {
while (sum > 0) {
sale();
}
}
private synchronized void sale() {
//双重判断,因为多个线程可能都进入了while循环,
// 虽然只有一个执行锁住的代码,但其他线程会在释放锁后继续执行,
// 而无需再通过while判断导致结果出错。
if (sum > 0) {
System.out.println(Thread.currentThread().getName() + "卖出 第 " + (sum--) + "张票");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.getMessage();
}
}
}
}
主程序:
package piao;
/**
* className:Main
* Package:piao
* Description:
*
* @Date:2019/12/3 9:28
* @Author:cc
*/
public class Main {
public static void main(String[] args) {
//一个资源
Ticket ticket = new Ticket();
//多个代理
Thread t1 = new Thread(ticket, "一号窗口");
Thread t2 = new Thread(ticket, "二号窗口");
Thread t3 = new Thread(ticket, "三号窗口");
t1.start();
t2.start();
t3.start();
}
}
运行结果:
注意::在判断票数的时候要使用双重判断,若没有判断两次,则会多卖出一张票,见下面代码:
private synchronized void sale() {
//双重判断,因为多个线程可能都进入了while循环,
// 虽然只有一个执行锁住的代码,但其他线程会在释放锁后继续执行,
// 而无需再通过while判断导致结果出错。
// if (sum > 0) {
System.out.println(Thread.currentThread().getName() + "卖出 第 " + (sum--) + "张票");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.getMessage();
}
// }
}
运行结果: