黑马程序员技术交流社区

标题: 关于synchronized一个疑问 [打印本页]

作者: 白水丶    时间: 2015-5-13 15:20
标题: 关于synchronized一个疑问
synchronized放在这两个不同的位置有什么区别?

QQ截图20150513151515.png (10.73 KB, 下载次数: 104)

QQ截图20150513151515.png

QQ截图20150513151725.png (11.45 KB, 下载次数: 99)

QQ截图20150513151725.png

作者: 白水丶    时间: 2015-5-13 15:27
在run()外面new一个类可以实现synchronize,但是在run()里面new()一个类synchronize并没有作用
作者: hzhzhen    时间: 2015-5-13 15:33
因为两个地方都会改变共享的数据,两个地方用同一个obj锁可以保证线程的安全性。要不然有可能一个线程没有打印完数据,另外的一个线程已经把变量改变。
作者: 白水丶    时间: 2015-5-13 15:40
hzhzhen 发表于 2015-5-13 15:33
因为两个地方都会改变共享的数据,两个地方用同一个obj锁可以保证线程的安全性。要不然有可能一个线程没有 ...

C:\Users\Administrator\Desktop
这是同一个程序,只是将obj换个位置运行,将obj放在run()方法里面生成时锁并没有作用
作者: hzhzhen    时间: 2015-5-13 16:00
白水丶 发表于 2015-5-13 15:40
这是同一个程序,只是将obj换个位置运行,将obj放在run()方法里面生成时锁并没有作用 ...

噢 刚刚没仔细看呢,

有作用,起码锁上的代码只能进去一个线程,另外一个在外面等,如果不加锁的话,到了最后sale为1的时候,线程1进去了,此时sale还是1,但是还没有来得及打印自减,线程2又拿到资源,这里sale还是1  判断1大于0  也进去了 ,造成的结果sale有可能会有0呢。
作者: hzhzhen    时间: 2015-5-13 16:05
你的意思是换了位置之后就不起作用了吗?
作者: 白水丶    时间: 2015-5-13 16:11
这个程序运行结果

QQ截图20150513153739.png (126.72 KB, 下载次数: 102)

QQ截图20150513153739.png

作者: 白水丶    时间: 2015-5-13 16:14
hzhzhen 发表于 2015-5-13 16:05
你的意思是换了位置之后就不起作用了吗?

是的!!!!!!
作者: hzhzhen    时间: 2015-5-13 16:23
本帖最后由 hzhzhen 于 2015-5-13 16:24 编辑
白水丶 发表于 2015-5-13 16:14
是的!!!!!!

你开启两个或多个线程。run方法运行了两次或多次就有两个或多个对象了,对象不唯一,所以就不是同一个锁了,所以就锁不上了,这样能理解?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2