面试连环炮
先来一连炮简单的面试,看你能顶住几轮?
栈长:
1、多线程情况下,进行数字累加(count++)要注意什么?
张三:
要注意给累加方法加同步锁,不然会出现变量可见性问题,变量值被其他线程覆盖出现不一致的情况
栈长:
2、保证变量的可见性,用 volatile 修饰不就行了吗?
张三:
volatile 是可以保证可见性,但不能保证原子性和线程安全
栈长:
3、除了加同步锁这种方案,还有别的方法吗?
张三:
还可以用 JDK 中的原子类,比如:AtomicInteger、AtomicLong,它们是通过 CAS 算法实现的一种乐观主义
栈长:
4、不错,还知道别的么?
张三:
呃……
认真的,你能顶住几轮?
这些问题是 Java 程序员面试过程中必问的,出场率贼高,Java 程序员必懂,这些题在Java面试库小程序中也都有详细答案,这里就不展开了。
你还知道别的么?最后一轮的答案就是今天的主题!
更好的选择:LongAdder
你还在用 AtomicInteger、AtomicLong 原子类进行并发累加操作吗?那你就 OUT 了!
除了 AtomicInteger、AtomicLong,其实在 JDK 8 中更建议使用 LongAdder 进行原子性操作,性能更好,如果你使用的还是 JDK 7-,那当我没说,即使如此,也不能找借口不知道,毕竟 JDK 8 是现在的主流应用版本了。
阿里巴巴最新的 Java开发手册 是这么定义的: