java并发编程——并发编程的挑战

本文是阅读《Java并发编程的艺术》后将自己记忆的理论知识和理解复写出来的产物,若有不足,欢迎指正!

java并发编程是什么?让多个线程同时处理一个任务,从而达到快速的效果。但不是所有场景都适合并发编程。并发编程的挑战有哪些呢?①并发需要对线程的调度,自然需要切换线程,这就带来了上下文切换的挑战,这里关系到中断。如何保存被中断的线程的上下文,如何选择下一个线程,如何在被中断的线程再次运行时恢复现场?如何减少上下文切换的开销?②在线程竞争资源时有何挑战?死锁③并发编程的运行速度是有上限的,受限于硬件资源和软件资源,也就是资源限制,如何解决?

一、上下文切换

上下文切换就是从一个线程切换到另一个线程的过程。

1.上下文切换的过程

出于某些原因如时间片到,正在运行的线程被中断,当前的状态会被保存,然后切换到下一个进程。

2.优点缺点

优:实现并发编程的必不可少的一部分,对更快地运行程序有积极作用。

缺:在某些情况下,上下文切换次数太多,造成更大地开销,反而不如单线程运行快。

3.如何减弱缺点的影响——减少上下文切换

(1)无锁并发编程

将数据ID用哈希算法分为多端,每段有单独线程处理

(2)CAS(CompareAndSet)

在多个线程竞争资源时,代替了锁的功能,减少了加锁解锁带来地上下文切换

(3)最少线程

避免创建不需要的线程,造成大部分线程等待的局面

(4)协程

单线程实现多任务的调度,在用户态运行

二、死锁

死锁是加锁的线程间互相等待对方释放锁内的资源的一种状态, 如何避免死锁:

(1)避免一个线程拥有多个锁

(2)避免一个线程锁内占用多个资源

(3)尝试使用定时锁

(4)数据库锁的加锁和解锁必须在同一个数据库连接里

三、资源限制

程序运行的快慢还受到硬件资源和软件资源的限制,甚至会使并发线程串行运行,这样反而比同情况下的单线程慢。硬件资源限制有:带宽的上传/下载速度,硬盘读写速度、CPU处理速度,软件资源限制有:数据库连接数、socket连接数

1.部分解决方法

(1)集群并发编程

(2)连接池

(3)根据不同资源限制调整并发度

你可能感兴趣的:(并发编程,java,开发语言,后端,并发编程)