一、为什么引入 AtomicInteger ?
谈到线程安全,会首先想到了synchronized 和 Lock,但是这种方式又有一个名字,叫做互斥锁,一次只能有一个持有锁的线程进入,再加上还有不同线程争夺锁这个机制,效率比较低,所以又称 悲观锁
与之相对应,就有了 乐观锁 的概念:它不加锁去完成某项操作,如果因为冲突失败就重试,直到成功为止。
AtomicInteger 保证线程安全就是使用了乐观锁,所以相对于悲观锁,效率更高。
在有多个线程同时使用CAS操作一个变量时,只有一个会胜出并成功更新,其余均会失败。失败的线程不会被挂起,仅被告知失败,并且允许再次尝试,当然,也允许失败的线程放弃操作
二、AtomicInteger 原理分析
1. 具体使用
假如我们想实现一个功能来统计网页访问量,可以使用 count++
来统计访问量,但是这个自增操作不是线程安全的。
加锁实现:
class Counter {