Java 互斥是如何运作的?
我想了解互斥理论是如何运作的 上面说 当这样的链表在多个执行线程之间共享时,两个执行线程可以尝试同时删除两个不同的节点,一个执行线程将节点Java 互斥是如何运作的?,java,concurrency,Java,Concurrency,我想了解互斥理论是如何运作的 上面说 当这样的链表在多个执行线程之间共享时,两个执行线程可以尝试同时删除两个不同的节点,一个执行线程将节点i-1的下一个指针更改为指向节点i+1,而另一个执行线程将节点i的下一个指针更改为指向节点i+2 困惑于此: 虽然两个删除操作都成功完成,但未达到所需的链表状态:节点i+1仍保留在列表中,因为节点i-1的下一个指针指向节点i+1 the desired state of the linked list is not achieved 我可以知道他想说什么吗
i-1
的下一个指针更改为指向节点i+1
,而另一个执行线程将节点i
的下一个指针更改为指向节点i+2
困惑于此:
虽然两个删除操作都成功完成,但未达到所需的链表状态:节点i+1仍保留在列表中,因为节点i-1的下一个指针指向节点i+1
the desired state of the linked list is not achieved
我可以知道他想说什么吗?因为节点I-1的下一个指针指向节点I+1?无法理解。您提供的示例(我相信已在中概述)缺少一些关键细节
- 我们有一个共享资源
(i-1)->(i)->(i+1)->(i+2)
- 我们有两个执行线程,让我们调用它们
,和T1
,同时作为共享资源访问链表T2
同时删除节点T1
(i)
删除节点T2
(i+1)
- 如果我们按顺序执行这些步骤,结果列表将是
(i-1)->(i+2)
- 我们得到的是:
(i-1)->(i+1)->(i+2)
A -> B -> C -> D
你告诉线程1“嘿,帮我移除B,好吗?”。同时,你告诉线程2“嘿,你能帮我去掉C吗?”
然后同时发生以下情况:
- 线程1认为“好的,我想删除B。这意味着我必须指向C而不是B。”
- 线程2认为“好的,我想删除C。这意味着我必须将B指向D而不是C。”
A -> C -> D
B -^
A不再指向B;它指向C。同样,B不再指向C;它指向D
…由于B不再可访问,因此将对其进行垃圾收集,留下以下内容:
A -> C -> D
我们告诉一个线程删除B,另一个线程删除C。B已经消失,但C仍然在列表中。这不是我们所期望的;我们希望只剩下A和D。
这是一个非常简单的例子,说明了当多个线程同时修改同一数据时,会发生多么可怕的错误。您需要使用困难的技巧才能使其工作,或者使用“互斥”,即一次仅对列表进行一个线程的修改。请澄清您的问题。1) 就我所见,问题的主体根本不是相互排斥。2) 描述似乎与“remove”的一个具体实现有关,但您还没有向我们展示该实现的代码。为什么C仍然在列表中?