在互联网业界里,只要你有相应的技术,过了面试后一般工作就稳了,所以面试可谓是十分重要的,本篇文章就来了解下近三年常见的java面试题吧。
1)、Java 中能创建 volatile 数组吗
能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组。我的意思是,如果改变引用指向的数组,将会受到
volatile 的保护,但是如果多个线程同时改变数组的元素,volatile 标示符就不能起到之前的保护作用了。
2)、volatile 能使得一个非原子操作变成原子操作吗
一个典型的例子是在类中有一个 long 类型的成员变量。如果你知道该成员变量会被多个线程访问,如计数器、价格等,你最好是将其设置为
volatile。为什么因为 Java 中读取 long 类型变量不是原子的,需要分成两步,如果一个线程正在修改该 long
变量的值,另一个线程可能只能看到该值的一半(前 32 位)。但是对一个 volatile 型的 long 或 double 变量的读写是原子。
3)、volatile 修饰符的有过什么实践
一种实践是用 volatile 修饰 long 和 double 变量,使其能按原子类型来读写。double 和 long
都是64位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile
型的 long 或 double 变量的读写是原子的。volatile 修复符的另一个作用是提供内存屏障(memory
barrier),例如在分布式框架中的应用。简单的说,就是当你写一个 volatile 变量之前