并发编程(一):并发编程常见问题


0.学习资料

《Java并发编程的艺术》第一章


1.上下文切换

单核处理器支持多线程时,通过cpu时间片切换(分配)来实现

  • 时间片执行完可能会切换到其他任务
  • 切换前保存当前任务状态,然后加载其他任务,之后某个时间片切换回该任务可继续加载该任务,这个任务切换过程就是一次上下文切换

任务从保存到加载的过程,任务间切换的时间

导致在数据量少时并发反而不如串行(创建与切换的消耗)

1.1 查看上下文切换

Lmbench3工具可查看上下文切换时长

vmstat命令可查看上下文切换次数

1.2 减少上下文切换

无锁并发编程

给线程分段使它们处理的任务不冲突,如ConcurrentHashMap

CAS算法

Java的Atomic包,原子操作

Compare and swap,比较并交换,不需要加锁

使用最少线程

避免创建不必要的线程

协程调度

通过协程实现任务调度

2.死锁

线程相互等待释放锁则造成死锁

避免死锁四个方法

  • 避免一个线程获取多个锁
  • 避免一个锁内占用多个资源,尽量保证每个锁只占用一个资源
  • 可以使用定时锁来代替内部锁
  • 数据库锁的加锁和解锁必须在一个数据库连接里,否则会解锁失败

3.资源限制

硬件:带宽,硬盘,cpu等

软件:数据库连接,socket连接等

引发问题

资源不足导致并发性能不如串行,无法并发执行

解决资源限制

硬件:搭建集群或提高单机性能

软件:使用池复用资源,数据库/socket连接池

4.JUC

Java.util.concurrent,JDK并发包,能够解决很多并发问题。

posted @ 2021-03-11 20:02  菜鸟kenshine  阅读(110)  评论(0编辑  收藏  举报