相关疑难解决方法(0)

发生在与Java中的易失性字段和同步块的关系之前 - 以及它们对非易失性变量的影响?

我对线程概念还很陌生,并尝试更多地了解它.最近,我发现了一篇关于Jeremy Manson撰写的" Java中易失手段"的博客文章,他写道:

当一个线程写入一个volatile变量,而另一个线程看到该写入时,第一个线程告诉第二个线程关于内存的所有内容,直到它执行对该volatile变量的写入.[...] 所有的由线程1看到的存储内容,才写信给[volatile] ready,必须是可见的主题2,它读取值后true进行ready.[自己强调]

现在,这是否意味着在写入volatile变量时,线程1的内存中保存的所有变量(volatile或not)将在读取volatile变量后变为可见?如果是这样,是否可以从官方Java文档/ Oracle源代码中将该语句拼凑起来?从哪个版本的Java开始这个工作?

特别是,如果所有线程共享以下类变量:

private String s = "running";
private volatile boolean b = false;
Run Code Online (Sandbox Code Playgroud)

并且线程1首先执行以下操作:

s = "done";
b = true;
Run Code Online (Sandbox Code Playgroud)

然后线程2执行(在线程1写入volatile字段之后):

boolean flag = b; //read from volatile
System.out.println(s);
Run Code Online (Sandbox Code Playgroud)

这会保证打印"完成"吗?

如果我将写入和读取放入块中而不是声明b,会发生什么?volatilesynchronized

另外,在题为" 线程之间是否共享静态变量? "的讨论中,@ TREE 写道:

不要使用volatile来保护多个共享状态.

为什么?(对不起;我还没有就其他问题发表评论,或者我会在那里问过......)

java multithreading volatile synchronized

49
推荐指数
3
解决办法
8383
查看次数

如果使用“memory_order_relaxed”检查,为什么要使用“memory_order_seq_cst”设置停止标志?

Herb Sutter 在他的“原子<>武器”演讲中展示了原子的几个示例用途,其中之一可归结为以下内容:(视频链接,带时间戳)

  • 一个主线程启动多个工作线程。

  • 工人检查停止标志:

    while (!stop.load(std::memory_order_relaxed))
    {
        // Do stuff.
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 主线程最终执行此操作stop = true;(注意,使用 order= seq_cst),然后加入工作线程。

Sutter 解释说,使用 order= 检查标志relaxed是可以的,因为谁在乎线程是否会因稍大的延迟而停止。

但为什么要stop = true;在主线程中使用呢seq_cst?幻灯片上说这是故意不这样做relaxed,但没有解释原因

看起来它会起作用,可能会有更大的停止延迟。

这是性能和其他线程看到标志的速度之间的折衷吗?即,由于主线程仅设置标志一次,我们不妨使用最强的排序,以尽快传达消息?

c++ concurrency stdatomic

13
推荐指数
1
解决办法
710
查看次数