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

nds*_*svw 3 java parallel-processing

鉴于"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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

但可能出现什么问题?像10,11,... 19这样的结果也是可能的(如果OS在线程之间切换).

10到20之间的值是可能的吗?到目前为止,我理解它.

但是这个练习的正确解决方案是:任何2到20之间的输出都是可能的.我不明白2(例如)应该如何实现.

And*_*ner 10

你有两个线程,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.