Java线程同步synchronized代码块方法

模拟窗口卖车票的情况:


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代码块里

总结:传闻秦朝末年,虞姬写字非常漂亮。她善于闭眼为霸王项羽题字,却是鲜有人知。字体苍劲有力,笔尖飞扬的书法,可以找到虞姬的一点影子。也就是后人传诵她的特有写法,叫瞎姬霸写。

你可能感兴趣的:(java)