gpt4 book ai didi

java - 如何解释 "StrangeLoop"的所有可能结果值?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:44:10 26 4
gpt4 key购买 nike

给定一个像这样的“StrangeLoop”代码:

2 个线程运行一个循环(每个),它们获取并设置 MyInteger 类对象的值:

哪些结果/输出是可能的?

class MyInteger
{
private int value;

public synchronized int getValue()
{
return value;
}

public synchronized void setValue(int value)
{
this.value = value;
}
}

public class StrangeLoop extends Thread
{
private MyInteger data;

public StrangeLoop(MyInteger data)
{
this.data = data;
}

public void run()
{
for (int i = 1; i <= 10; i++)
{
int local = data.getValue();
local++;
data.setValue(local);
}
}

public static void main(String[] args)
{
MyInteger data = new MyInteger();
StrangeLoop t1 = new StrangeLoop(data);
StrangeLoop t2 = new StrangeLoop(data);
t1.start();
t2.start();
try
{
t1.join();
t2.join();
}
catch (InterruptedException e)
{
}
System.out.println("Final value: " + data.getValue());
}
}

如果一个线程在另一个线程已经执行完循环后运行了它的循环,程序的输出应该是Final value: 20

但是会出什么问题呢?像 10,11,...19 这样的结果也是可能的(如果操作系统在线程之间切换)。

10 到 20 之间的值是可能的吗?到目前为止,我明白了。

但是这个练习的正确解法是:2 到 20 之间的任何输出都是可能的。我不明白 2(例如)怎么可能。

最佳答案

您有两个线程,T1 和 T2。他们将分别进行 10 次读取 (10R) 和 10 次写入 (10W)。因为读取和写入是同步的,所以可以保证它们不会并行发生;并且先前写入的值在任一线程的后续读取中可见。

  • T1读取值0
  • T2 读写值 9 次(现在值是 9)
  • T1写入值1

T1现在已经做了1R,1W; T2做了9R,9W。

  • T1读取值1
  • T2读取值1

(或者反过来:这两个的顺序并不重要)

T1做了2R,1W; T2做了10R,9W。

  • T1写2次,然后读写8次

T1做到了10R,10W。

  • T2 写入值 2。

T2做到了10R,10W。

最后写入的值为2,按要求。

关于java - 如何解释 "StrangeLoop"的所有可能结果值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54278270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com