Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 互斥是如何运作的?_Java_Concurrency - Fatal编程技术网

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仍然在列表中?