【发布时间】:2017-08-03 19:16:56
【问题描述】:
我有一个对象:
class Data{
int a;
int b;
AtomicIntegerArray c = new AtomicIntegerArray(10000);
}
线程 A 和 B 在以下场景中使用此对象:
A 创建一个数据(现在称为“数据”)
A 将数据发送到队列。
B 从队列中读取,获取数据。
B 更新数据的字段并向 A 发出数据已被处理的信号。
B 睡着了。
A 开始处理数据的字段。
现在,到目前为止,我为确保内存可见性所做的工作是:
class Data{
volatile int a;
volatile int b;
volatile AtomicIntegerArray c = new AtomicIntegerArray(10000);
}
这可行,但让我担心。当线程A取回数据时,它只需要在开始时同步一次内存,而不是每次接触到一个字段。我想我可以通过简单地做一个来实现这一点:
synchronized(data){}
一旦它知道数据已经更新,因此使用 Data 的第一个实现。这样我只做一次昂贵的内存同步。
我说的对吗?我是否还需要确保线程 B 在将数据“移交”给线程 A 之前同步数据?
请记住,我只对内存同步/可见性感兴趣,没有锁定机制和线程之间的信号是无关紧要的。我已经涵盖了。
信号:
class A implements callback{
private volatile boolean dataProcessed;
private final Data data = new Data();
@Override
public void dataHasBeenProcessed(){
dataProcessed = true;
}
void someMethod(){
dataProcessed = false;
threadB.processData(data, this);
while(!dataProcessed)
...sleep;
data.workOnFields();
}
因此,A 将数据发送给 B,然后在处理数据时轮询 B 在回调方法中设置的 volatile 布尔值。
【问题讨论】:
-
> B 更新数据的字段并向 A 发出数据已被处理的信号。 B如何向A发送信号?你能粘贴那个代码吗?
-
当然,我已经更新了
-
作为答案发布。太大了,不适合评论:)
标签: java multithreading memory-management thread-safety