MrZive的gravatar头像
MrZive2019-01-11 20:18:16

龙8国际娱乐pt老虎机

class TT implements Runnable{
	@Override
	public void run() {
		Integer apple=new Integer(10);
		synchronized (apple) {//与while语句互换后就没事
			while(true){
				if(apple==0){
					try {
						apple.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				apple--;
				System.out.println(apple);
			}
		}
	}
}

线程运行后会报java.lang.IllegalMonitorStateException,一直想不明白为什么会报错,debug后,发现apple.wait后,线程没暂停,继续循环到synchronized再次获取锁才报的错,如果synchronized与while语句互换后就没问题,这又是为什么呢???

所有回答列表(10)
genmon5214的gravatar头像
genmon5214 LV43月29日

没改前,synchronized (apple)锁在循环外,而你循环中调用了wait()方法,它在同步代码块或者同步函数中被调用是会释放锁对象的,调用sleep方法不会.当第一次循环结束后,此次锁住的对象就被释放了,当你下一次循环时,对象就没有被锁住.

而你改后,将synchronized (apple)锁放在循环内,这样它每次循环时,即便是调用了wait()方法释放对象,也会被再次锁住.

评论(0)最佳答案
丶右转的gravatar头像
丶右转 LV91月14日

顶顶顶顶顶顶顶顶顶

hqblyq的gravatar头像
hqblyq LV21月14日

顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

13836800381的gravatar头像
13836800381 LV51月15日

挺好

hr4370913的gravatar头像
hr4370913 LV61月16日

挺好的

张丨丨丨丨丨的gravatar头像

不知道

JustLikebongbongbong的gravatar头像
JustLikebongbongbong LV111月22日

当执行到apple--后,你的synchrod(apple)锁对象发生变化,导致你的锁消失,而wait()方法不在锁中就会报java.lang.IllegalMonitorStateException

我要很多的牛币的gravatar头像
我要很多的牛币 LV41月24日

0

宾克斯的美酒的gravatar头像
宾克斯的美酒 LV102月12日

欢乐锁,悲观锁

MrZive的gravatar头像
MrZive LV55月31日

谢谢大家的回答

顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友