题2

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个资源同时⼜不导致死锁?

使⽤多线程的时候,⼀种⾮常简单的避免死锁的⽅式就是:指定获取锁的顺序,并强制线程按

照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出 现死

锁了。

你可能感兴趣的:(题2)