假设我创建了一个集合
volatile ArrayList <Integer> vo_al = new ArrayList<>();
问题:我可以确定当我创建100个线程时,将读取和写入值到那里,线程不会破坏彼此的内存,但是一个线程会随着操作而改变
vo_al.add(2);
将立即对所有其他线程可见?
原则上在多线程编程中用 volatile 一词标记集合是否有意义?
假设我创建了一个集合
volatile ArrayList <Integer> vo_al = new ArrayList<>();
问题:我可以确定当我创建100个线程时,将读取和写入值到那里,线程不会破坏彼此的内存,但是一个线程会随着操作而改变
vo_al.add(2);
将立即对所有其他线程可见?
原则上在多线程编程中用 volatile 一词标记集合是否有意义?
当然不是。
volatile
与通过引用存在的对象没有以任何方式连接,它保证变量的写入和读取将是原子的(据我所知,只有long
并且在写入和读取中不是原子的double
)并且变量的更改(更改引用!而不是任何类似的方法add
)将立即对其他线程可见。原子访问
如果您需要
List
跨多个线程安全地进行修改,请使用Collections.synchronizedList
:但这并不意味着不需要同步块或其他同步方法。例如,您需要将列表的第一个元素原子地增加一个。即使
synchronizedList
您需要使用synchronized
块,因为有两种不同的操作,线程可以在这两种操作之间停止,或者此时另一个线程的值发生了变化。是的,如果某个线程中的链接发生变化。