Java-关于多线程可见性的一些问题

1.请列出Happens-before的几种规则

1.单线程happen-before原则:在同一个线程中,书写在前面的操作happen-before后面的操作。
2.锁的happen-before原则:同一个锁的unlock操作happen-before此锁的lock操作。
3.volatile的happen-before原则:对一个volatile变量的的写操作happen-before对此变量的任意操作
4.happen-before的传递性原则:如果A操作happen-before B操作,B操作happen-before C操作,那么A操作 happen-before C操作
5.线程启动的happen-before原则:同一个线程的start方法happen-before此线程的其它方法。
6.线程中断的happen-before原则:对线程interrupt方法的调用happen-before被中断线程的检测到中断发送的代码。
7.线程终结的happen-before原则:线程中的所有操作都happen-before线程的终止检测。
8.对象创建的happen-before原则:一个对象的初始化完成先于他的finalize方法调用。

2.volatile 能使得一个非原子操作变成原子操作吗?为什么?

不能够完全保证,对一个变量使用了volatile关键字,如果操作该变量同时有多个指令,就不能保证程序完全正常。

3.哪些场景适合使用Volatile

我们期待一些字段的行为和预期一致的时候适合使用volatile变量。在多线程的场景下,需要保证其有序性,可见性又不需要保证原子性的情况使用volatile。
          如果需要保证其原子性的情况下只能使用synchronized锁。
         为什么首选volatile不选synchronized呢?
         因为synchronized是会造成阻塞线程,是串行来执行的,效率比较慢。
         volatile是通过自动使用lock汇编来添加内存屏障达到有序性和可见性的。

4.如果对一个数组修饰volatile,是否能够保证数组元素的修改对其他线程的可见?为什么?

只能保证数组本身发生改变时,其它线程可见。比如数据指向新的对象。但是数组内元素并不遵循happen-before原则。

5.锁对象----内存中---Mark World的变化

Java-关于多线程可见性的一些问题_第1张图片

你可能感兴趣的:(Java)