gpt4 book ai didi

java - 如何在java中使 'modified' ArrayList线程安全?

转载 作者:行者123 更新时间:2023-12-01 12:48:16 26 4
gpt4 key购买 nike

我正在实现一个分布式互斥锁,我需要跟踪所有已发出的请求。

我有一个可比较的消息类,并且我有一个修改后的 ArrayList

requestList = new ArrayList<Message>() {
public synchronized boolean add(Message msg) {
boolean ret = super.add(msg);
Collections.sort(requestList);
return ret;
}

我怀疑这个 requestList 正在被两个线程修改,并且我看到列表顶部不应该出现的元素。如何使这个 requestList 线程安全?

执行以下操作会有效吗?

requestList = Collections.synchronizedList(new ArrayList<Message>() {
public synchronized boolean add(Message msg) {
boolean ret = super.add(msg);
Collections.sort(requestList);
return ret;
});

Collection.synchronizedList 是如何工作的?通过为 ArrayList 的所有方法设置“同步”?

最佳答案

would doing as follows work?

没有。

您的定制add方法正在与 requestList 不同的对象上进行同步对象用于同步。因此,不会出现相互排斥。

有一个Collections.synchronizedList将互斥对象作为额外参数的方法重载。不幸的是,它被声明为包私有(private),因此您将无法使用它。

so, how do I have a list which IS thread safe, and maintains the sorted order on each add?

没有简单的解决方案,但有几种可行的方法:

  • 更改您的代码,以便 requestList对象是私有(private)的。通过包装器方法实现对列表的所有访问...并将它们声明为 synchronized .

  • 编写您自己的自定义同步列表包装器,该包装器可以在提供给它的互斥锁上进行同步。然后用你的 this 实例化包装器作为互斥体的对象;即您的 add 的对象方法正在同步。

假设您的 add方法实际上是“排序列表”包装类的一部分,第一个选项是最好的。

使用PriorityBlockingQueue的建议作为 List 的替代品是一个很好的方法,尽管您确实丢失了 List 中获得的一些方法。 API。 (例如,您不能对 Queue ... 执行基于索引的操作)

关于java - 如何在java中使 'modified' ArrayList线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24472685/

26 4 0