在上一篇博客中,初步解决了多线程卖票数据共享问题,但是对于多线程来说最令人头疼的就是线程安全。而上一篇博客《黑马程序员_Java多线程的实现》就存在线程安全问题。
package lh.zjzk;
/**
* 此程序实现卖票
* @author Administrator
*
*/
public class ThreadDemo1 implements Runnable{
private int ticket =100;
@Override
public void run() {
while(true){
if(ticket >0)
System.out.println(Thread.currentThread().getName()+"还有"+(ticket--)+"张票");
else
break;
}
}
}
假设此时票数还剩下1,此时线程1进行if(ticket>0)判断后失去权,线程2也在判断后失去权,线程3判断后失去权,那么当线程1,线程2,线程3在一次获取权时,就会出现ticket为负数的情况。这时为了解决这个问题我们使用synchronized关键字来解决这个问题。
package lh.zjzk;
/**
* 此程序实现卖票
*
* @author Administrator
*
*/
public class ThreadDemo1 implements Runnable {
private int ticket = 100;
@Override
public void run() {
while (true) {
synchronized (this) {
if (ticket > 0) {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "还有"
+ (ticket--) + "张票");
} else
break;
}
}
}
}