Java 在多个线程之间共享有效的不可变对象
下面hashmap中更新的值是否会反映在读卡器线程中(线程不会修改hashmap的状态)? 如果改用Java 在多个线程之间共享有效的不可变对象,java,concurrency,Java,Concurrency,下面hashmap中更新的值是否会反映在读卡器线程中(线程不会修改hashmap的状态)? 如果改用ConcurrentHashMap怎么办 public class SharedDataTest { private static class SomeWork implements Runnable { private Map<String, String> dataTable; public SomeWork(Map<String, String>
ConcurrentHashMap
怎么办
public class SharedDataTest {
private static class SomeWork implements Runnable {
private Map<String, String> dataTable;
public SomeWork(Map<String, String> dataTable) {
this.dataTable = dataTable;
}
@Override
public void run() {
//do some stuff with dataTable
}
}
public static void main(String[] args) {
Map<String, String> dataTable = new HashMap<String, String>();
dataTable.put("someKey","someValue");
Runnable work1 = new SomeWork(dataTable);
Runnable work2 = new SomeWork(dataTable);
new Thread(work1).start();
new Thread(work2).start();
}
}
公共类SharedStatest{
私有静态类SomeWork实现Runnable{
私有地图数据表;
公共工作(映射数据表){
this.dataTable=dataTable;
}
@凌驾
公开募捐{
//用dataTable做一些事情
}
}
公共静态void main(字符串[]args){
Map dataTable=newhashmap();
put(“someKey”、“someValue”);
Runnable work1=新的SomeWork(数据表);
Runnable work2=新的SomeWork(数据表);
新线程(work1.start();
新线程(work2.start();
}
}
是,它将反映,但可能存在不一致性,这取决于您在run()
方法上所做的操作,因为您没有在外部进行同步。使用Collections.synchronizedMap(map)
或更好地使用ConcurrentHashMap
,它将免费为您提供线程安全
public SomeWork(Map<String, String> dataTable) {
this.dataTable = Collections.synchronizedMap(dataTable);
}
publicsomework(映射数据表){
this.dataTable=Collections.synchronizedMap(dataTable);
}
检查HashMap的文档,该文档要求在并发情况下进行外部同步
- 请注意,此实现不是 已同步。*如果多个线程访问哈希映射 同时,并且至少一个*线程修改映射 从结构上讲,它必须*外部同步。(一) 结构修改是添加或删除结构的任何操作* 一个或多个映射;仅更改与键关联的值* 实例已包含的不是*结构 修改。)这通常通过在 自然封装贴图的某个对象
如果在启动线程之前完成了映射的所有初始化,则不需要额外的同步。线程的开始将充当内存屏障,在该线程开始之前发生的任何事情都将对该线程可见
请注意,如果在线程启动后更改映射,则无法保证线程是否会看到该更改。最好使用
ConcurrentHashMap,而不是从外部同步映射
public class SharedDataTest {
private static class SomeWork implements Runnable {
private Map<String, String> dataTable;
public SomeWork(Map<String, String> dataTable) {
this.dataTable = dataTable;
}
@Override
public void run() {
//do some stuff with dataTable
}
}
public static void main(String[] args) {
Map<String, String> dataTable = new ConcurrentHashMap<String, String>();
dataTable.put("someKey","someValue");
Runnable work1 = new SomeWork(dataTable);
Runnable work2 = new SomeWork(dataTable);
new Thread(work1).start();
new Thread(work2).start();
}
}
公共类SharedStatest{
私有静态类SomeWork实现Runnable{
私有地图数据表;
公共工作(映射数据表){
this.dataTable=dataTable;
}
@凌驾
公开募捐{
//用dataTable做一些事情
}
}
公共静态void main(字符串[]args){
Map dataTable=新的ConcurrentHashMap();
put(“someKey”、“someValue”);
Runnable work1=新的SomeWork(数据表);
Runnable work2=新的SomeWork(数据表);
新线程(work1.start();
新线程(work2.start();
}
}