1. 问题描述
/**
* @Description 线程安全场景模拟
* @Author lin
* @Date 2021/3/1 18:15
*/
public class TestDemo {
public static void main(String[] args) {
SellShoes sellShoes= new SellShoes();
//多家电商同时买鞋
new Thread(sellShoes, "某bao").start();
new Thread(sellShoes, "某dong").start();
new Thread(sellShoes, "某ning").start();
}
}
//模拟卖鞋下单
class SellShoes implements Runnable{
//库存
private int stock = 2;
@Override
public void run() {
while (true) {
if (stock > 0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖出了倒数第" + stock-- + "双鞋");
}else {
break;
}
}
}
}
结果1:
某bao卖出了倒数第1双鞋
某ning卖出了倒数第2双鞋
某dong卖出了倒数第2双鞋
结果2:
某bao卖出了倒数第2双鞋
某ning卖出了倒数第1双鞋
某dong卖出了倒数第0双鞋
2. 解决方法
class SellShoes implements Runnable{
//库存
private int stock = 2;
@Override
public void run() {
while (true) {
synchronized (this) {
if (stock > 0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖出了倒数第" + stock-- + "双鞋");
}else {
break;
}
}
}
}
}
class SellShoes implements Runnable{
//库存
private static Integer stock = 2;
@Override
public void run() {
sellOne();
}
private synchronized void sellOne() {
while (true) {
if (stock > 0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖出了倒数第" + stock-- + "双鞋");
}else {
break;
}
}
}
}
class SellShoes implements Runnable{
//库存
private static Integer stock = 2;
private ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while (true) {
lock.lock();
try {
if (stock > 0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖出了倒数第" + stock-- + "双鞋");
}else {
break;
}
}catch (Exception e){
e.getMessage();
}finally {
lock.unlock();//必须解锁
}
}
}
}