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

您好,我想请问下为什么分别对count跟iObject进行synchronized会出现两种不同的情况?

54d8db630001b87505000341.jpg

54d8db630001fc8b05000352.jpg

请问下这两种情况出现的原因是啥?

正在回答

2 回答

另外,第一种情况,你要搞清楚,Ingeger是不能作为同步的对象的,因为容易发生拆装箱操作,比如你的count--,实际上相当于Integer count  = new Integer(count-1);这个时候很明显,new出了一个新的Integer对象,已经不是原来的对象了,同步自然也就无效了!你可以去看下Integer的一些方法的源码!或者看下一些书对拆装箱部分的讲解!

1 回复 有任何疑惑可以回复我~
#1

慕容9634379 提问者

多谢指导!!豁然开朗,看来基础知识还不够牢固。回去多看书看源码去。
2015-02-11 回复 有任何疑惑可以回复我~

这个是这样子!首先第二种情况,采用Object对象作为同步对象是正确的,但是你把synchronized(iObject)放在了while循环外面,我们知道synchronized方法或者块内的操作是原子的,不会被其他线程打断,只有它自己退出了synchronized方法活这块,其它线程才可以占用到CPU资源,所以一旦某个线程进入到了synchronized块内后,这个线程就会一直执行到while循环结束,这时候由于你的是第二个线程首先进入了synchronized,也就是首先持有了互斥锁,因此打印出了你截图的结果,而线程2退出synchronized块后,也就是锁释放后,count的值已经变为了0,因此这是其它线程抢占到CPU资源,进入synchronized块,也没有代码可执行了!你可以synchronized块里面,但是while循环后面打印出来一句话看下结果,就一目了然了!另外,如果把synchronized块whle循环里面,只同步住count--和所拥有system.out.println.......这两家代码,就会看到可能是三个线程的信息都会打印出来!

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

举报

0/150
提交
取消

您好,我想请问下为什么分别对count跟iObject进行synchronized会出现两种不同的情况?

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