Java 在数组中先进行建立

Java 在数组中先进行建立,java,multidimensional-array,synchronization,happens-before,Java,Multidimensional Array,Synchronization,Happens Before,有一个快速同步问题,以下是我的问题: a) Class1具有如下定义的并发哈希映射: ConcurrentMap<String, int[][]> map = new ConcurrentHashMap<String, int[][]>(); c) 最后,我有另一个线程,叫做Thread2。此线程获取一个id,检查映射是否具有该id的值。如果没有,什么也不会发生。如果是,则将int[]]中的值相加,并使用该数字进行某些计算(此处不作修改) 我试图弄清楚我的操作是否是原

有一个快速同步问题,以下是我的问题:

a) Class1具有如下定义的并发哈希映射:

ConcurrentMap<String, int[][]> map  = new ConcurrentHashMap<String, int[][]>();
c) 最后,我有另一个线程,叫做Thread2。此线程获取一个id,检查映射是否具有该id的值。如果没有,什么也不会发生。如果是,则将int[]]中的值相加,并使用该数字进行某些计算(此处不作修改)

我试图弄清楚我的操作是否是原子的。 b)中的操作很好,因为创建/修改数组和插入映射仅限于一个线程(Thread1

此外,由于插入到映射中会建立一个“发生在操作之前”的值,这将确保c)将在int[]中看到更新的值

但是,如果Thread2在映射中查找相同的int[][],并在Thread1修改时尝试对其求和,我不太确定会发生什么

我认为Thread2将在int[]中看到旧的(但未损坏的)值,这是正确的吗。原因是,在Thread1将值放回映射之前,Thread2将看不到新的修改


非常感谢。

您的操作不是原子操作,线程2将在线程1修改值时尝试求和


为避免复制原始文件,请修改副本并放回副本。

您的操作不是原子操作,线程2将在线程1修改值时尝试求和


为了避免重复,您需要修改副本并放回副本。

正如旁注,您可能知道这一点,但听起来您似乎在尝试实现生产者/消费者模式,请查看更多想法正如旁注,您可能知道这一点,但是听起来好像你在尝试实现一个生产者/消费者模式,看看有没有更多的想法,汤姆,谢谢。或者,我可以a)使用原子引用数组b)在b)中创建一个新数组(而不是从映射中获取旧数组),然后用它更新映射以获得特定Id。嗨,汤姆,谢谢。或者,我是否可以a)使用原子引用数组b)在b)中创建一个新数组(而不是从映射中获取旧数组),然后用它更新映射的特定Id。
 private class Thread1 implements Runnable{

            public void run(){
                //keepRunning is volatile
                while( keepRunning ){

                  String id     = "ItemA";
                  int[][] value = map.get(id);

                  //If value is null, create an int[][] and put it back as value for Id
                  //If value is not null, modify the contents according to some logic  
                 }
             }
    }