【问题标题】:How are all the possible resulting values of a "StrangeLoop" explainable?“StrangeLoop”的所有可能结果值如何解释?
【发布时间】:2019-01-20 16:01:53
【问题描述】:

给定一个像这样的“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(例如)应该如何实现。

【问题讨论】:

  • 谁说 2 是可能的?你的老师?你的朋友?或者这是一个众所周知的练习?
  • @Stefan 这是我之前在 SO 上看到的一个练习,我认为是在面试问题的背景下。

标签: java parallel-processing


【解决方案1】:

您有两个线程,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。

【讨论】:

  • 当然。不久前看到同样的问题,但找不到。
  • 非常感谢。此外,如果甚至 2(您展示的)是可能的,也可以写出 3、4、5、6、7、8 和 9 当然也是可能的输出。
猜你喜欢
  • 2016-02-25
  • 2016-02-06
  • 1970-01-01
  • 2023-03-24
  • 2014-07-10
  • 2017-05-02
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多