本文是阅读《Java并发编程的艺术》后将自己记忆的理论知识和理解复写出来的产物,若有不足,欢迎指正!
java并发编程是什么?让多个线程同时处理一个任务,从而达到快速的效果。但不是所有场景都适合并发编程。并发编程的挑战有哪些呢?①并发需要对线程的调度,自然需要切换线程,这就带来了上下文切换的挑战,这里关系到中断。如何保存被中断的线程的上下文,如何选择下一个线程,如何在被中断的线程再次运行时恢复现场?如何减少上下文切换的开销?②在线程竞争资源时有何挑战?死锁③并发编程的运行速度是有上限的,受限于硬件资源和软件资源,也就是资源限制,如何解决?
一、上下文切换
上下文切换就是从一个线程切换到另一个线程的过程。
1.上下文切换的过程
出于某些原因如时间片到,正在运行的线程被中断,当前的状态会被保存,然后切换到下一个进程。
2.优点缺点
优:实现并发编程的必不可少的一部分,对更快地运行程序有积极作用。
缺:在某些情况下,上下文切换次数太多,造成更大地开销,反而不如单线程运行快。
3.如何减弱缺点的影响——减少上下文切换
(1)无锁并发编程
将数据ID用哈希算法分为多端,每段有单独线程处理
(2)CAS(CompareAndSet)
在多个线程竞争资源时,代替了锁的功能,减少了加锁解锁带来地上下文切换
(3)最少线程
避免创建不需要的线程,造成大部分线程等待的局面
(4)协程
单线程实现多任务的调度,在用户态运行
二、死锁
死锁是加锁的线程间互相等待对方释放锁内的资源的一种状态, 如何避免死锁:
(1)避免一个线程拥有多个锁
(2)避免一个线程锁内占用多个资源
(3)尝试使用定时锁
(4)数据库锁的加锁和解锁必须在同一个数据库连接里
三、资源限制
程序运行的快慢还受到硬件资源和软件资源的限制,甚至会使并发线程串行运行,这样反而比同情况下的单线程慢。硬件资源限制有:带宽的上传/下载速度,硬盘读写速度、CPU处理速度,软件资源限制有:数据库连接数、socket连接数
1.部分解决方法
(1)集群并发编程
(2)连接池
(3)根据不同资源限制调整并发度