Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多个线程之间共享有效的不可变对象_Java_Concurrency - Fatal编程技术网

Java 在多个线程之间共享有效的不可变对象

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>

下面hashmap中更新的值是否会反映在读卡器线程中(线程不会修改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 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();
}
}