gpt4 book ai didi

java - 此类线程对不同线程安全吗?

转载 作者:行者123 更新时间:2023-11-30 06:55:15 27 4
gpt4 key购买 nike

这是类:

public class Saver {

private static ArrayList<String> nameCache = new ArrayList<>();

public static synchronized void add(ArrayList<String> names) {
nameCache.addAll(names);
}

public static synchronized void save() {
for (String name : nameCache) {
//write name
}
nameCache.clear();
}
}

不同的线程将以不同的顺序调用保存和添加。但是这个 synchronized 关键字会让这个进程线程安全吗?

这是解决并发问题的正确方法吗?如果不是,那么什么是解决此问题的好方法?

最佳答案

这是线程安全的,因为您不会让线程相互踩踏。在类级锁上同步保证一次只有一个线程可以访问列表,任何一个线程的更改对所有其他线程都是可见的,因此 hahn's answer是正确的(我+1)。但是关于这个问题

is this the right way to fix concurrency problems, if not what would be a good way to solve this problem

答案是,“这取决于上下文,但一般不会。”

每个线程都必须等待同一个锁,当列表被保存时,每个想要添加内容的线程都必须等待。这可能会产生 Not Acceptable 性能问题,具体取决于负载和列表的保存频率。

解决方案视情况而定,但一般尽量减少保存方法持有锁所需的时间。您可以让保存方法制作列表的副本,只持有足够长的时间来制作副本,然后保存列表的副本,以便其他线程可以在保存副本的同时调用添加方法.

缓存往往比你想象的更充满危险(我是在保存过时的项目吗?缓存什么时候需要过期?我是不是造成了内存泄漏?等等),它也是一个技术实现细节往往与业务逻辑混在一起,这使得代码更丑陋,更难理解。使数据和方法静态化会将全局状态引入到应用程序中,这可能会使测试变得困难,使数据和方法属于对象实例并使用依赖注入(inject)将其注入(inject)到您想要的位置可能更可取。

关于java - 此类线程对不同线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35509370/

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