问答详情
源自:-

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

54d8db630001b87505000341.jpg

54d8db630001fc8b05000352.jpg

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

提问者:慕容9634379 2015-02-10 00:08

个回答

  • MartonZhang
    2015-02-10 15:01:18

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

  • MartonZhang
    2015-02-10 14:57:24

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