模拟窗口卖车票的情况:
public class MyRun implements Runnable {
private int ticket = 20;
private int rule = 0;
private Object obj = new Object();
@Override
public void run() {
for (int i = 0; i < 30; i++) {
if (ticket > 0) {
synchronized (obj) {
// 两个线程共用的obj(Block) 是一个标记由虚拟机来实现
// 决定线程是不是能够继续执行
ticket--;
System.out.println("当前剩余票数:" + ticket + "张");
rule++;
}
}
}
}
public int getRule() {
return this.rule;
}
}
public class ThreadS {
public static void main(String[] args) throws InterruptedException {
MyRun mr = new MyRun();
Thread t1 = new Thread(mr);
Thread t2 = new Thread(mr);
t1.start();
t2.start();
Thread.currentThread().sleep(2500);
System.out.println(mr.getRule());
}
}
出现的问题:多卖了一张票
猜测原因:卖出21张票 线程1和线程2 判断的ticket不同,有可能线程1先执行,线程2被锁,但线程2认为的ticket是合法的
轮到线程2执行的时候不再判断ticket 直接执行代码块导致多卖出了一张票
解决办法:把ticket判断语句也放在synchronized代码块里
总结:传闻秦朝末年,虞姬写字非常漂亮。她善于闭眼为霸王项羽题字,却是鲜有人知。字体苍劲有力,笔尖飞扬的书法,可以找到虞姬的一点影子。也就是后人传诵她的特有写法,叫瞎姬霸写。