「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。
前言
前面几篇文章详细介绍了Java并发领域常见的知识原理,对并发知识有了系统的理解,今天再对并发知识做一次阶段性总结。下面是前几天关于并发知识的文章,感兴趣的伙伴自取。
Java并发编程之ArrayBlockingQueue知识整理
这些文章包括了Java并发编程中常用的一些组件,但是还有ConcurentHashMap,LongAdder,AtomicLong,ForkJoinPool等并发知识未涉猎,笔者还没有很好的理解,后续有更深刻的理解再出文分析。
并发知识在Java中是比较难学懂,也比较难学好的一项基本工,因为并发编程不仅仅要有足够的理论知识做支撑,还要在实际并发的业务场景中打磨历练,才能对并发编程有更高的理解。笔者结合自身的工作经验和最近学习的心得,从下面几个问题来对并发知识做一次阶段总结,给前面的学习做一个沉淀。
一、并发出现的背景
并发问题其实不是计算机出现就有了,并发是随着硬件的不断升级,业务系统复杂度上升而逐渐演化而来的。
1、随着cpu的升级,一台计算机可能有多个cpu核心,那么就同时支持多个线程运行,多个线程对共享资源的操作就会产生并发问题。
2、随着业务系统的复杂度上升,一个业务系统从单体应用演化成分布式应用,到现在的微服务应用,用户的请求可能会被路由到不同的计算机进行处理,这样如果多个请求都对同一个共享资源进行操作,也会带来并发的问题。
二、并发带来的问题
1、从数据层面讲,并发会导致程序数据错乱,程序出现和预期不一致的结果
2、从业务层面讲,并发可能会导致资金损失,损害公司或者用户利益
三、并发问题的解决方案
在Java领域,jdk设计者提供了多种解决并发的手段,可以以下几类:
1、无锁
像ThreadLocal就是一种无锁的设计,通过空间换取线程安全性。
2、乐观锁/自旋锁
AtomicLong,ReentrantLock,Semaphore等是借助cas这种乐观锁机制,
减少了系统切换开销
3、重量级别锁
Synchronized是一种重量级锁的手段,会导致线程内核态和用户态之间的切换,性能是极低的。
四、并发编程的未来 随着硬件的发展和社会数字化的发展,并发编程的场景应该是会越来越多,并发编程应该是未来程序员必须掌握的一项基本工。近两年go语言也越来越流行,go语言是一门为并发而生的语言,在并发领域表现强悍的语言,期待以后有更好的发展。