为什么程序员招聘都要5年经验起?因为他们懂Java8底层优化!

本文探讨了Java并发编程中,为何程序员招聘常要求5年经验,聚焦于Java 8的并发优化。文章通过场景引入,分析了线程不安全的累加问题,提出synchronized的解决方案,但指出其过于重量级。接着,文章详细解释了Atomic原子类的CAS(Compare and Set)机制,展示了如何在无锁情况下实现线程安全的并发更新,并讨论了Java 8为优化高并发性能引入的LongAdder类及其分段CAS策略。
摘要由CSDN通过智能技术生成

一、前情回顾

上篇文章给大家聊了一下volatile的原理,具体参见:《入坑两个月自研非外包创业公司,居然让我搞懂了volatile!》

这篇文章给大家聊一下java并发包下的CAS相关的原子操作,以及Java 8如何改进和优化CAS操作的性能。

因为Atomic系列的原子类,无论在并发编程、JDK源码、还是各种开源项目中,都经常用到。而且在Java并发面试中,这一块也属于比较高频的考点,所以还是值得给大家聊一聊。


二、场景引入,问题凸现

好,我们正式开始!假设多个线程需要对一个变量不停的累加1,比如说下面这段代码:

在这里插入图片描述

实际上,上面那段代码是不ok的,因为多个线程直接这样并发的对一个data变量进行修改,是线程不安全性的行为,会导致data值的变化不遵照预期的值来改变。

举个例子,比如说20个线程分别对data执行一次data++操作,我们以为最后data的值会变成20,其实不是。

最后可能data的值是18,或者是19,都有可能,因为多线程并发操作下,就是会有这种安全问题,导致数据结果不准确。

至于为什么会不准确?那不在本文讨论的范围里,因为这个一般只要是学过java的同学,肯定都了解过多线程并发问题。


三、初步的解决方案:synchronized

所以,对于上面的代码,一般我们会改造一下,让他通过加锁的方式变成线程安全的:

在这里插入图片描述

这个时候,代码就是线程安全的了,因为我们加了synchronized,也就是让每个线程要进入increment()方法之前先得尝试加锁,同一时间只有一个线程能加锁,其他线程需要等待锁。

通过这样处理,就可以保证换个data每次都会累加

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值