62,614
社区成员
发帖
与我相关
我的任务
分享
while(flag&&count>=0)
{
/*synchronized放在while循环体的内部,假设当前线程是t1,执行到count == 0时 while执行完但还未进入到synchronized块的时候可能会被其他线程抢占此资源 假设是t2,执行run()方法打印出count == 0,然后count-- ,此时count == -1,但此时对于t1来说while语句已经判断了!所以对于t1来说它会直接调用System.out.println()方法,打印的却是count为-1时的语句*/
synchronized(this)
正确的解决办法是将synchronized(this)放在while语句之外,至于为什么,请楼主自己思考。
public void run()
{
synchronized(this)
{
while(flag&&count>=0)
{
System.out.println("这是"+Thread.currentThread().getName()+"在卖"+count+"张票");
count--;
try {
this.wait(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
或者在同步块内再加上判断。
public void run()
{
while(flag&&count>=0)
{
synchronized(this)
{
if(flag&&count>=0){ //这里再加上判断
System.out.println("这是"+Thread.currentThread().getName()+"在卖"+count+"张票");
count--;
}else{
return ;
}
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void run() {
while (flag && count >= 0) {
synchronized (this) {
if(count >= 0){
System.out.println("这是" + Thread.currentThread().getName()
+ "在卖" + count + "张票");
count--;
}
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}