gpt4 book ai didi

java - 让线程读取共享变量直到被修改

转载 作者:行者123 更新时间:2023-12-01 23:25:43 24 4
gpt4 key购买 nike

我有一个简单的类,它不需要线程在读取共享对象时获取锁。但是,如果任何特定线程尝试修改此共享对象,则没有线程可以读取该对象。贝娄是我类(class)的一个例子。

package com.taylor.wall.core.domain;

import java.util.List;

public class Wall {

// This needs to be synchronized and concurrent
private List<Post> posts;
private final Object lock = new Object();

public void addPost(Post post) {
synchronized (lock) {
posts.add(post);
}
}

// Unfortunately this is wasteful, because for threads must now acquire lock before reading
public List<Post> getPost() {
synchronized (lock) {
return posts;
}
}
}

什么是更好的选择?墙对象在许多线程之间共享。另外,将我的列表声明为最终静态也不是一个好主意,因为该列表太大而无法重新创建和设置。

最佳答案

您根本不应该返回该列表,因为您无法知道调用者将如何处理它。您应该自己提供所有列表操作,并根据需要加锁。或者通过Collections.unmodifyingList() 将列表提供为只读,并且仅提供更新操作。如果您确实认为争用会成为一个问题,那么 java.util.concurrent.locks.ReadWriteLock 就是这种情况。 .

关于java - 让线程读取共享变量直到被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20037680/

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