Java 多线程的线程安全需要保证原子性和可见性,volatile 关键字可以保证可见性不能保证原子性,synchronized 关键字可以保证可见性和原子性,不过有几点疑问请教一下大佬:
(1)volatile 关键字如何保证的可见性,在书上和博客上看到了两种不同的说法,不知道哪种正确:
1.赋值操作后会立即写回主内存,一个线程数据回写到主内存会导致其他线程对应数据无效(通过嗅探总线上传输的数据检查自身数据),线程下次使用时若发现自身数据失效,则会从主内存上取数据更新;
2.线程中每次 use 变量时,都需要连续执行 read->load->use 几项操作保证使用的数据是最新的,线程每次 assign 变量时,都需要连续执行 assign->store->write 几项操作,保证赋值后立即写回主内存;
(2)未使用 volatile 关键字的普通变量赋值后工作内存写回主内存的时机: volatile 关键字修饰的变量赋值语句后会立即写回主内存,普通变量赋值修改后什么时候写回主内存呢,是当一个方法执行完后吗?
(3)volatile 使用内存屏障解决指令重排序带来的线程安全问题,synchronized 是怎么解决指令重排序带来的线程安全问题的呢?
1
petelin 2017-10-16 10:22:34 +08:00
第二点, 普通变量写会内存的时间就是那条语句执行完之后啊, 这样线程也是不安全的.
其他不会, 求大佬 |