作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
现场http://download-llnw.oracle.com/javase/tutorial/essential/concurrency/starvelive.html有一个活锁的概念,首先说这里的线程没有被阻塞,然后说线程被阻塞......“他们仍然互相阻塞”所以我不太明白......如果他们被阻止似乎陷入僵局......
如果能够模拟 Java 网站上报告的 Alphonse 和 Gaston 示例,任何人都可以向我提交一个更好的活锁情况的简单 Java 代码吗?
最佳答案
发生死锁时,有两个或多个线程:每个线程持有一个锁,需要获取另一个锁。每个线程都睡在另一个线程持有的锁上。因为他们睡着了,所以他们“死了”——不执行任何代码,而且他们永远不会。
使用活锁时,两个或多个线程处于 Activity 状态并正在执行代码,但它们无法继续其代码中过去的条件,因为它们太忙于响应来自活锁中其他线程的事件。
此时我的 Java 已经严重生锈了,所以让我们来一个希望简单的描述:
两个线程,A
和 B
,需要获取锁 1
和 2
才能执行某些操作操作(吃三明治):
Thread A tries this:
Acquire lock 1
if try_lock(2) == success
eat the sandwich
else
drop 1
sleep a bit
go back to start
Thread B tries this:
Acquire lock 2
if try_lock(1) == success
eat the sandwich
else
drop 2
sleep a bit
go back to start
如果这两个线程总是交替执行指令,那么任何一个都不会吃东西三明治:他们都将把所有的时间都花在获取、测试和放弃锁定,但他们永远无法取得进展。
关于java - 线程活锁疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3413759/
我是一名优秀的程序员,十分优秀!