A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 白水丶 中级黑马   /  2015-5-13 15:20  /  702 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

synchronized放在这两个不同的位置有什么区别?

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

QQ截图20150513151515.png

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

QQ截图20150513151725.png

8 个回复

倒序浏览
在run()外面new一个类可以实现synchronize,但是在run()里面new()一个类synchronize并没有作用
回复 使用道具 举报
因为两个地方都会改变共享的数据,两个地方用同一个obj锁可以保证线程的安全性。要不然有可能一个线程没有打印完数据,另外的一个线程已经把变量改变。
回复 使用道具 举报
hzhzhen 发表于 2015-5-13 15:33
因为两个地方都会改变共享的数据,两个地方用同一个obj锁可以保证线程的安全性。要不然有可能一个线程没有 ...

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

噢 刚刚没仔细看呢,

有作用,起码锁上的代码只能进去一个线程,另外一个在外面等,如果不加锁的话,到了最后sale为1的时候,线程1进去了,此时sale还是1,但是还没有来得及打印自减,线程2又拿到资源,这里sale还是1  判断1大于0  也进去了 ,造成的结果sale有可能会有0呢。
回复 使用道具 举报
你的意思是换了位置之后就不起作用了吗?
回复 使用道具 举报
这个程序运行结果

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

QQ截图20150513153739.png
回复 使用道具 举报
hzhzhen 发表于 2015-5-13 16:05
你的意思是换了位置之后就不起作用了吗?

是的!!!!!!
回复 使用道具 举报
本帖最后由 hzhzhen 于 2015-5-13 16:24 编辑

你开启两个或多个线程。run方法运行了两次或多次就有两个或多个对象了,对象不唯一,所以就不是同一个锁了,所以就锁不上了,这样能理解?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马