说说 AtomicInteger 和 synchronized 的异同点?
相同点
都是线程安全
不同点
1、背后原理
synchronized 背后的 monitor 锁。在执行同步代码之前,需要首先获取到 monitor 锁,执行完毕后,再释放锁。原子类,线程安全的原理是利用了 CAS 操作。
2、使用范围
原子类使用范围是比较局限的,一个原子类仅仅是一个对象,不够灵活。而 synchronized 的使用范围要广泛得多。比如说 synchronized 既可以修饰一个方法,又可以修饰一段代码,相当于可以根据我们的需要,非常灵活地去控制它的应用范围
3、粒度
原子变量的粒度是比较小的,它可以把竞争范围缩小到变量级别。通常情况下,synchronized 锁的粒度都要大于原子变量的粒度。
4、性能
synchronized 是一种典型的悲观锁,而原子类恰恰相反,它利用的是乐观锁。