java线程同步synchronized问题?

publicclassBuyTicketThreadimplementsRunnable{privateIntegerticket=newInteger(20);priv... public class BuyTicketThread implements Runnable {

private Integer ticket = new Integer(20);
private boolean flag = true;

public void run() {
while (flag) {
buy();
}
}

public void buy() {
synchronized (ticket) {
if (ticket <= 0) {
flag = false;
System.out.println("票已经全部售完");
return;
}
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "拿到了第" + ticket-- + "张票");
}
}

public static void main(String[] args) {

/*
下面这种声明方式是:
多个线程作用于同对象
*/

BuyTicketThread thread = new BuyTicketThread();

new Thread(thread, "小明").start();
new Thread(thread, "小李").start();
new Thread(thread, "小孙").start();
}
}

为什么这个对象锁还会发送多线程安全问题呀?
代码如下,为什么这个对象锁还会发送
展开
 我来答
Aifuday
2020-06-27 · TA获得超过408个赞
知道小有建树答主
回答量:479
采纳率:66%
帮助的人:54.1万
展开全部
不要使用 Integer 作为同步锁对象,Integer 值发生变化指向会改变,也就是非同一对象
synchronized 同步锁对象必须是个不变的对象!
synchronized (ticket)
改成
synchronized (BuyTicketThread.class)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式