版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/github_34402358/article/details/89073893
多线程之经典案例–售票案例
public static void main(String[] args) {
System.out.println("Hello World!");
new MyThread("张三 ").start();
new MyThread("李四 ").start();
}
public static class MyThread extends Thread {
// 需要卖的票数
int mTicket = 12;
public MyThread(String name) {
super(name);
}
@Override
public void run() {
while (mTicket > 0) {
if (mTicket > 0) {
System.out.println(getName() + "卖出了第" + mTicket + "张票");
mTicket--;
} else {
System.out.println("票卖完了");
}
}
}
}
这时你就会发现因为车票没有共享,所以造成了每一个人都卖出去了12张车票,为了不引起这种换买票的行为,所以我们需要把车票共享,因此需要把车票定义为静态常量,用static修饰。这时有会出现另一种问题,可能同一时间张三和李四卖出了同一张票,为了不引起这种换买票的行为,所以我们需要把车票上锁(Synchronzied:同步锁,作用是实现线程间同步,对同步的代码加锁,使得每一次,只能有一线程进入同步块,从而保证线程间的安全性),比如张三正在卖这张票,李四就看不见了。张三不卖了,李四才能对这张车票进行处理。
public static void main(String[] args) {
System.out.println("Hello World!");
new MyThread("张三 ").start();
new MyThread("李四 ").start();
}
public static class MyThread extends Thread {
// 需要卖的票数
static int mTicket = 12;
// 创建一个静态钥匙
static Object key = new Object();
public MyThread(String name) {
super(name);
}
@Override
public void run() {
while (mTicket > 0) {
synchronized (key) {
if (mTicket > 0) {
System.out.println(getName() + "卖出了第" + mTicket + "张票");
mTicket--;
}
}
}
if (mTicket == 0) {
System.out.println("票卖完了");
}
try {
//休息一秒
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}