首页 热点资讯 义务教育 高等教育 出国留学 考研考公

java wait()和notify()

发布网友 发布时间:2022-04-22 05:05

我来回答

2个回答

热心网友 时间:2022-04-13 12:17

wait()是不一定要在synchronized里用的。

你说的这个情况我理解一下,大概是这样的:
因为你需要同步,这里的同步条件与其他线程有关,所以要设置一个标识(或者门牌、入口),这样其他的线程在达到这个条件后才会被触发,不然的话,wait和notify都没起到该起的作用。

原子操作是这个意思,就是你期待这个操作要么成功,要么不成功,不期望做了一半这种情况,以i++为例,在底层的话,可能会分解为几个动作:
1 先取i的值,
2 做i+1的操作,
如果在取1和2之间i的值被其他线程改变了,这个结果就不对了,所以为了达到期望结果,你希望这个i++是个原子操作,也就是在中途不允许其他线程干扰。
如果你对这里加上synchronized,就不会中途打断了。

对于死锁,这个涉及的面还是挺大的,但也是可以理解的,关键就在于资源竞争上,给你个我自己想的例子吧,可能不是很恰当,主要描述下场景长:
假设你家有两个空调,你和你弟弟一人一个,依然一个遥控器可以对其进行操作,但现在你拿着遥控器,但没电池;你弟弟拿着电池,但没遥控器,现在你想要电池,你弟弟想要遥控器,这样没有一方妥协的话,就成死锁了。

希望对你有所帮助。

热心网友 时间:2022-04-13 13:35

synchronized保证有一个线程执行当前代码时,别的线程不能执行当前代码,是被阻塞的。比如对一个数据A操作,线程1取出数据,假设是0,加1,存入数据。在加一的时候,线程2也取出数据(仍然是0,因为线程1还在进行加1操作,没有存入数据呢),加1,这时线程1运算完成,将结果0+1=1存入,线程2继续操作,也是0+1=1。这样计算结果是错误的,运算了2次加1操作,应该是2。这时候要用synchronized保证线程1操作A时,线程2不能操作A。

还是上面的例子,线程1在执行synchronized修饰的代码块的时候,可以调用wait(),把执行权让给别的线程,进入等待状态。也可以调用notify()通知别的等待线程,意思是“这段代码我不执行了,你们来吧”。

原子操作就是不可分割,比如上面提到的加1,如果用synchronized修饰了,就是原子操作,能保证调用一次结果一定会加1,不会受其他线程执行的影响。

忘了说死锁了,楼上的死锁例子举的挺好。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com