volatile类型 + AtomicInteger 实现线程计数器

感谢 明哥( @李某人的窥视) 帮我检查、优化代码,并提出这个思路(完全他提出的想法,我只是负责验证)。

0. 结论

并发编程中有三个概念:原子性(不可拆分,共同进退)、可见性(多线程访问一个变量,一个变全都变)、有序性(按照一定代码顺序,避免指令重排)。

volatile类型可以控制可见性和有序性,但如果变量对象不属于原子操作(如i++),就会导致线程不安全。

AtomicInteger,可以原子操作的int类型数据,继承于java.lang.Number类,但和Integer类无关(且无法替代)。

前者实现可见性&有序性,但变量操作没有原子性而被指出线程不安全。后者恰巧实现了原子性,当两者结合起来,自然就实现了线程安全。

// 定义对象
volatile AtomicInteger count = new AtomicInteger();
// AtomicInteger对象部分方法
// 自增(i++)且获取结果
count.incrementAndGet();
// 自减(i--)且获取结果
count.decrementAndGet();
// 获取当前值
countDownLaunch.get();
// 还有很多好用的方法,请见 官方文档(文末参考资料第一条)

结论说完了以后,好像不知道该怎么说了,这篇就一章吧。

之前自己写的加锁修饰的方法,到那时很明显这个更简单、靠谱,而且方法还多。💯

全文终。

参考资料(不分先后):

AtomicInteger - java docs - Oracle

java中voliate的讲解 - yinbucheng - CSDN

并发基础1(线程实现、voliate、syn锁实现)-潜水壁虎-SCDN

posted @ 2020-04-01 18:27  wgh0807  阅读(413)  评论(0编辑  收藏  举报