相关疑难解决方法(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
查看次数

锁实现死锁

我有两个线程,一个 id 0,另一个 id 1。根据这些信息,我尝试构造一个锁,但似乎死锁,但我不明白为什么,有人可以帮助我吗?

我试图构建一个发生这种情况的场景,但这真的很难

  private int turn = 0;
  private boolean [] flag = new boolean [2];
   
  public void lock(int tid) {
    int other;
 
    other = (tid == 0) ? 1 : 0;

    flag[tid] = true;
    while (flag[other] == true) {
      if (turn == other) {
        flag[tid] = false;
        while (turn == other){}
        flag[tid] = true;
      }
    }
  }
 
  public void unlock(int tid) {
    //turn = 1-t;
    turn = (tid == 0) ? 1 : 0;
    flag[tid] = …
Run Code Online (Sandbox Code Playgroud)

java deadlock

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

标签 统计

java ×2

deadlock ×1

multithreading ×1

synchronized ×1

volatile ×1