以下是经典Concurency in Practice:
当线程A写入volatile变量并且随后线程B读取相同的变量时,在写入volatile变量之前A可见的所有变量的值在读取volatile变量后变为B可见.
我不确定我是否真的能理解这句话.例如,在这种情况下所有变量的含义是什么?这是否意味着使用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) 考虑代码片段
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) 这是我面临的问题.在运行下面的代码时,我有时会在打印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)