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

© 应佳锋 中级黑马   /  2012-4-1 00:59  /  1759 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

我现在的理解是  被synchronized包含的代码只要拥有相同的锁 那么同一时间只能有一个线程去执行


问题1:  如果只有单独的一个代码块需要被synchronized  那么锁是否可以随便指定一个对象  但是如果有2个地方被synchronized 而且这2块地方是 同一时间只能有一个线程进去   是这样吗

5 个回复

倒序浏览
加入有俩个对象 都要运行相同的代码 为了安全这时候你可以synchronized 定把锁头,锁头只要是个对象就可以,第一个对象进去了 ,第二个必须要等第一个出来才能进去
同一段时间俩个对象不可以同时运行,犹如上厕所,厕所酒好比线程运行的代码,俩个人就好比俩个对象,在同一段时间内,只能有一个人上厕所,下一个人只能等他从厕所 出来
回复 使用道具 举报
是这样的任意对象都有一把锁,因为任意对象都继承至Object,Object上有一把锁(monitor)    wait()与 notify()方法可让线程释放这把锁
回复 使用道具 举报
感觉2楼3楼并没有回答楼主的问题呀。我来试着解释一下。
从微观上看,cpu某个时间点只能执行一个线程,而多线程运行时cpu在快速切换,如果加上了锁,就必须把锁中的内容执行完再切换。
所以哥们,即使有两个地方有synchronized,只要有一个地方被锁住,即使另一个锁是空的也甭想进去。不过建议用同一把锁,
因为不同锁不仅cpu负担大而且容易死锁!
回复 使用道具 举报
cpu某个时间点只能执行一个线程,这只是针对单核的cpu而言,现在大多电脑都是双核多核cup,所以同一个时间点可以有多个线程甚至是多个进程执行,特别是大型系统肯定是用的多核cpu服务器。
回复 使用道具 举报
如果两个地方需要同步,那么这两个地方必须拥有相同的锁,这样可以保证同一时间只能有一个地方能被执行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马