为了账号安全,请及时绑定邮箱和手机立即绑定

加上static, synchronized 关键字呢??

如果用static 修饰车票的数量,然后在在车票减少的地方加上synchronized可以吗?

public class Ticket extends Thread {

private static int tickets = 5;

public void run() {

try {

Thread.sleep(100);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

while (tickets > 0) {

synchronized (this) {

tickets--;

System.out.println(Thread.currentThread().getName() + " has " + tickets + " tickets left!");

}

Thread.yield();

}

}

}

个人亲测不行,但是不知道问题在哪?敬求指教!!!

正在回答

4 回答

若梦厉害,说的对。

0 回复 有任何疑惑可以回复我~

synchronized的使用有问题,synchronized是对象锁。

0 回复 有任何疑惑可以回复我~

你的代码有两处错误

1.用继承Thread的方法实现多线程,需要new多个对象,这也是你在共享变量是加static的原因,所以,你使用的锁对象this是不同的对象,所以不能实现线程的互斥.可以使用该类的字节码对象Ticket.class作为锁对象.

2.如果已经实现了互斥,你需要在同步代码块中增加一个判断条件,用来终止程序继续执行,否则会出现打印负数的情况.因为,  未获得锁的线程会在循环内等待,当一条线程将tickets--到0的时候,其他等待的线程获得锁以后会继续执行后续代码,导致运行结果不准确.

3 回复 有任何疑惑可以回复我~

用你的代码可以实现多个线程同时卖票啊,不知道你说的是什么情况

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

加上static, synchronized 关键字呢??

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信