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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭冬 中级黑马   /  2012-12-9 21:32  /  1466 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭冬 于 2012-12-9 23:57 编辑

用synchronized可以进行同步,同步的步骤是线程先判断锁,如果锁是开的就可以进入锁中的代码,然后将锁锁住,这样就解决了多线程安全问题。
但是我想如果当线程判断锁为开的后,进入锁中代码但还没有将锁锁住的时候休眠了,在这个时候第二个线程判断锁也为开,于是也可以执行锁中代码。这样的话,
不就依然存在多线程的安全问题吗?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
当线程判断完一进去就会把锁锁上,应该不存在你说的那种情况。 我得理解是只要进去就直接锁上了。

就像火车上上厕所一样,进了厕所就会锁上门了。
回复 使用道具 举报
本帖最后由 翁鹏 于 2012-12-9 22:36 编辑

先说一点,将锁置位是一个原子操作,即CPU中只要执行一条机器代码就可以完成锁的置位。

所以,一个线程要么一下就把它锁上,要么就没锁上。

不存在你说的进入了任务代码区,而没有锁上的情况。
你说的情况只可能在 将锁置位不是原子操作,要多条机器代码才能完成的情况下可能发生。

要么在判断完锁时间片就到了,失去执行权,这时还没有进入代码区。

进入了代码区的第一个原子操作就是上锁。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
翁鹏 发表于 2012-12-9 22:31
先说一点,将锁置位是一个原子操作,即CPU中只要执行一条机器代码就可以完成锁的置位。

所以,一个线程要 ...

恩,谢谢你的回答,真是高手,明白了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马