在Java中使用volatile集合和数组
发布时间:2020-12-15 04:44:02 所属栏目:Java 来源:网络整理
导读:想象一下,我们有 volatile int publisher = 0;volatile ListString list = Arrays.asList("Buenos Aires","Córdoba","La Plata");volatile String[] array = {"Buenos Aires","La Plata"}; 据我所理解. 列表和数组中的初始值正确发布,并且对所有读取线程都
想象一下,我们有
volatile int publisher = 0; volatile List<String> list = Arrays.asList("Buenos Aires","Córdoba","La Plata"); volatile String[] array = {"Buenos Aires","La Plata"}; 据我所理解. 列表和数组中的初始值正确发布,并且对所有读取线程都可见. 初始化后添加的所有值都不是安全发布的. 我们仍然可以安全地阅读和发布它们 //in Thread 1 list.add("Safe City"); array[2] = "Safe city"; publisher = 1; //in Thread2 if(publisher == 1) { String city = list.get(3); city = array[2]; } 我对吗? 解决方法
这是正确的,但……
列表和数组中的volatile关键字在这里是无关紧要的 – 在写入其他值之后将值写入volatile发布者的事实,并在读取第二个线程中的其他值之前在您的条件中读回该值保证这些线程之间的内存一致性 如果从列表和数组中删除volatile关键字,则代码仍然是安全的. 如果删除发布者变量write / read,则添加操作*和数组赋值不再安全. 是的,对变量的初始分配也是安全的. *正如斯图尔特·马克斯所指出的那样,这个特定列表实际上是无效的,但我们假设它是例如一个ArrayList (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |