我的程序长这样:
public class Main {
private static ArrayList<T> list;
public static void main(String[] args) {
new DataListener().start();
new DataUpdater().start();
}
static class DataListener extends Thread {
@Override
public void run() {
while(true){
//Reading the ArrayList and displaying the updated data
Thread.sleep(5000);
}
}
}
static class DataUpdater extends Thread{
@Override
public void run() {
//Continuously receive data and update ArrayList;
}
}
}
为了在两个线程中使用此ArrayList,我知道有两种选择:
将ArrayList设置为volatile。然而,我在这篇文章中读到,只有当“写入变量不取决于其当前值”时,才允许将变量设置为volatile。我认为在这种情况下它并不是(例如,当您在ArrayList上执行add操作时,此操作后的ArrayList内容取决于当前ArrayList的内容,或者不是吗?)。另外,DataUpdater必须不时从列表中删除一些元素,我还读到说无法从不同的线程编辑volatile变量。
将此ArrayList设置为同步变量。但是,我的DataUpdater将不断更新ArrayList,那么这是否会阻止DataListener读取ArrayList?
我是否误解了任何概念,或者是否有其他选项可以实现此目标?
concurrency
еҢ…дёӯзҡ„йҳҹеҲ—д№ӢдёҖпјҢиҖҢдёҚжҳҜArrayList
гҖӮ - Titusvolatile
。任何对象都不能被设为volatile
。在Java中,唯一可以被设为volatile
的是_fields_。 - Solomon Slow