我的代码将在多线程上下文中工作。 不同的线程将被实例化
MyClass
.
但我也将它包装在构造函数内的
Collections.synchronizedList()
中。
这段代码线程安全吗??
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
class HelloWorld {
public static void main(String[] args) {
// The following whole code be run in different threads!
List<ConcurrentHashMap<String, Object>> data = new ArrayList<>();
ConcurrentHashMap<String,Object> hm = new ConcurrentHashMap<>();
hm.put("nice",1);
data.add(hm);
MyClass mc = new MyClass(data);
System.out.println(mc.getData()); //Will i get the correct data in every thread?
}
}
class MyClass {
private List<ConcurrentHashMap<String, Object>> data = Collections.synchronizedList(new ArrayList<>());
public MyClass( List<ConcurrentHashMap<String, Object>> data) {
this.data = Collections.synchronizedList(data);
}
public List<ConcurrentHashMap<String, Object>> getData() {
return data;
}
}
我想确保这是线程安全的,并且每个线程都获得正确的
data
值。
这段代码线程安全吗?
这个问题没有好的答案。
从技术上讲,您的
MyClass
类是完全线程安全的,因为它实际上是不可变的。但那又怎样呢?您的 MyClass
类不会 做 任何事情。这只是一个拥有 List
的东西。
从技术上讲,
List
本身是线程安全的,因为它是由Collections.synchronizedList(...)
构造的。但那又怎样呢?仅仅因为 List
是线程安全的,并不意味着 使用 它的代码是线程安全的。
从技术上讲,列表中的
Map
实例是线程安全的,因为它们必须是 ConcurrentHashMap
实例。但那又怎样呢?仅仅因为 ConcurrentHashMap
是线程安全的,...你明白了吗?
使用它的代码怎么样?您所显示的只是一个线程,将单个项目添加到列表中,然后打印列表中包含的字符串(间接地,通过 ConcurrentHashMap)。从技术上讲,这是线程安全的,因为每个单线程程序都是线程安全的。
但那又怎样?
投票结束。如果您展示一些使用您的
MyClass
类的真实多线程代码,将考虑重新打开。