相关疑难解决方法(0)

易变量和其他变量

以下是经典Concurency in Practice:

当线程A写入volatile变量并且随后线程B读取相同的变量时,在写入volatile变量之前A可见的所有变量的值在读取volatile变量后变为B可见.

我不确定我是否真的能理解这句话.例如,在这种情况下所有变量的含义是什么?这是否意味着使用volatile也会对非易失性变量的使用产生副作用?
在我看来,这句话有一些我无法理解的微妙含义.
有帮助吗?

java concurrency multithreading volatile memory-visibility

14
推荐指数
2
解决办法
1390
查看次数

返回volatile变量的函数是否需要同步?

setGameState()并且getGameState()可以从不同的线程调用.m_gameState是不稳定的,所以它的值/变化可能对其他线程可见.

问题: 函数是否需要synchronized变量或变量是否足够?

private volatile EGameState m_gameState;

public void setGameState(EGameState a_gameState) {
   m_gameState = a_gameState;
}

public EGameState getGameState() {
   return m_gameState;
}
Run Code Online (Sandbox Code Playgroud)

java volatile

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

易失性数组 - 元素的内存可见性

考虑代码片段

class A {

   private Map<String, Object> taskMap = new HashMap<>();
   private volatile Object[] tasksArray ;

   // assume this happens on thread1 
   public void assignTasks() {
     synchronized(taskMap){
         // put new tasks into map
         // reassign values from map as a new array to tasksArray ( for direct random access )
     }

    }

   // assume this is invoked on Thread2
   public void action(){
       int someindex =  <init index to some value within tasksArray.length>;
       Object[] localTasksArray = tasksArray;
       Object oneTask = localTasksArray[someindex]; …
Run Code Online (Sandbox Code Playgroud)

java arrays volatile thread-safety memory-visibility

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

java在多个锁下的对象可见性

这是我面临的问题.在运行下面的代码时,我有时会在打印B的内容时收到过时的数据.我无法理解为什么会发生这种情况,因为更新和接收B的内容受B锁的保护.

请注意,在更新到B期间,A和B的锁都被保留.访问B的内容时,只保留一个锁.

另请注意,B.updated()未同步,但我不认为这是问题,因为我确保更新的计数器设置为2,然后才访问B的内容.

class B {
  Object data
  int updated = 0

  // get and set protected by B's monitor
  synchronized Object getData() {
    return data;
  }
  synchronized setData(Object d) {
    data = d;
    updated += 1;
  }
  // deliberately not synchronized
  int updated() { return updated; }
}

class A {
    B b
    A() {
        new Thread t = new Thread(new UpdaterThread());
        t.start();
    }

   // when B is updated both A and B monitors are held
    synchronized String setB(Object …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading visibility locks

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