1.volatile 数组吗?
可以,但是创建的对象或数组的地址具有可⻅性,⾥⾯的数据是不可⻅的
2.volatile 类型变量提供什么保证?能使得⼀个⾮原⼦操作变成原⼦操作吗
volatile 提供 happens-before 的保证,确保⼀个线程的修改能对其他线程是可⻅的。
在Java 中除了 long 和 double 之外的所有基本类型的读和赋值,都是原⼦性操作。⽽64位的
long 和 double 变量由于会被JVM当作两个分离的32位来进⾏操作,所以不具有原⼦性,会产
⽣字撕裂问题。但是当你定义long或double变量时,如果使⽤ volatile关键字,就会获到(简单
的赋值与返回操作的)原⼦性
3.什么是原⼦操作
所谓原⼦操作是指不会被线程调度机制打断的操作;这种操作⼀旦开始,就⼀直运⾏到结束,
中间不会有任何 context switch (切 [1] 换到另⼀个线程)。
volatile 变量是什么?volatile 变量和 atomic 变量有什么不同
volatile则是保证了所修饰的变量的可⻅。因为volatile只是在保证了同⼀个变量在多线程中的可
⻅性,所以它更多是⽤于修饰作为开关状态的变量,即Boolean类型的变量。
volatile多⽤于修饰类似开关类型的变量、Atomic多⽤于类似计数器相关的变量、其它多线程并
发操作⽤synchronized关键字修饰。
volatile 有两个功⽤
1. 这个变量不会在多个线程中存在复本,直接从内存读取。
2. 这个关键字会禁⽌指令重排序优化。也就是说,在 volatile 变量的赋值操作后⾯会有⼀个
内存屏障(⽣成的汇编代码上),读操作不会被重排序到内存屏障之前。
4.如何确保N个线程可以访问N个资源同时⼜不导致死锁?
使⽤多线程的时候,⼀种⾮常简单的避免死锁的⽅式就是:指定获取锁的顺序,并强制线程按
照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出 现死
锁了。