gpt4 book ai didi

数组列表上的 java volatile /同步

转载 作者:行者123 更新时间:2023-12-01 09:21:14 25 4
gpt4 key购买 nike

我的程序是这样的:

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 易变。但是我读了 this article仅当“写入变量不依赖于其当前值”时,才允许使变量可变。我认为在这种情况下确实如此(因为例如,当您对 ArrayList 执行添加操作时,此操作后 ArrayList 的内容取决于 ArrayList 的当前内容,或者不是吗?)。此外,DataUpdater 必须时不时地从列表中删除一些元素,而且我还了解到无法从不同线程编辑 volatile 变量。
  • 使这个 ArrayList 成为一个同步变量。但是,我的 DataUpdater 会不断更新 ArrayList,所以这不会阻止 DataListener 读取 ArrayList 吗?

  • 我是否误解了这里的任何概念,还是有其他选择可以使这成为可能?

    最佳答案

    Volatile 根本帮不了你。 volatile的含义是线程 A 对共享变量所做的更改立即对线程 B 可见。通常,此类更改可能在某些缓存中仅对创建它们的线程可见,并且 volatile只是告诉 JVM 不要做任何会导致值更新延迟的缓存或优化。

    所以它不是一种同步方式。这只是确保变更可见性的一种手段。此外,它更改的是变量,而不是该变量引用的对象。也就是说,如果你标记 listvolatile ,如果您为 list 分配一个新列表,它只会有任何区别。 ,如果你改变了列表的内容就不会!

    你的另一个建议是制作 ArrayList一个同步变量。这里有一个误解。变量不能同步。唯一可以同步的是代码 - 整个方法或其中的特定块。您使用一个对象作为同步监视器。

    监视器是对象本身(实际上,它是监视器对象的逻辑部分),而不是变量。如果您在同步旧值后将不同的对象分配给同一变量,那么您将无法使用旧监视器。

    但无论如何,同步的不是对象,而是您决定使用该对象同步的代码。

    因此,您可以使用 list作为同步操作的监视器。但是你不能有list同步。

    假设您想使用列表作为监视器来同步您的操作,您应该设计它以便编写器线程不会一直持有锁。也就是说,它只是为单个读取更新、插入等获取它,然后释放它。为下一次操作再次抓取它,然后释放它。如果同步整个方法或整个更新循环,其他线程将永远无法读取它。

    在阅读线程中,您可能应该执行以下操作:

    List<T> listCopy;

    synchronized (list) {
    listCopy = new ArrayList(list);
    }

    // Use listCopy for displaying the value rather than list

    这是因为显示可能很慢——它可能涉及 I/O、更新 GUI 等。所以为了最小化锁定时间,您只需从列表中复制值,然后释放监视器,以便更新线程可以完成它的工作。

    除此之外, java.util.concurrent中还有很多类型的对象。包等,旨在帮助处理这样的情况,其中一侧在写,另一侧在读。检查文档 - 可能是 ConcurrentLinkedDeque会为你工作。

    关于数组列表上的 java volatile /同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32549628/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com