Java并发编程读书笔记(一)

  前几天整理电脑文件的时候,突然发现了之前还在kindle保存了关于并发编程的书,刚好自己在这方面挺薄弱的,故整理一波读书笔记,继续加强学习。

1.上下文切换

1.1 时间片分配算法

时间片是CPU分配给各个线程的时间,CPU通过不停地切换线程执行,使各个线程仿佛是”同时执行的“。切换任务时会保存上一个任务的状态,任务从保存到再加载的过程就是一次上下文切换。

多线程执行不一定比单线程执行任务快,因为线程有创建和上下文切换的开销。

1.2 如何减少上下文切换

无锁并发编程:多线程竞争锁的时候会产生上下文切换,故多线程处理数据时可以采用一些方法来避免使用锁。

CAS算法(无锁算法):Compare-and-Swap 比较并替换。CAS有三个操作数,内存地址V、旧的预期值A和即将要更新的值B。CAS执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V值修改为B,否则什么都不做。

使用最少线程:避免创建不需要的线程。

使用协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。

1.3 dump

jstack:Java虚拟机自带的一种堆栈跟踪工具。用于生成Java虚拟机当前时刻的线程快照,线程快照就是当前Java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致额长时间等待等等。

dump文件:是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。

Java线程dump:线程dump是非常有用的诊断java应用问题的工具,线程dump出来的信息包含线程基本信息如线程运行状态、标识和调用的堆栈,调用的堆栈包含完整的类名、所执行的方法。可通过线程dump文件来诊断很多JVM的问题,如线程阻塞、CPU使用率过高、堆内存不足等。

内存dump:当发现应用内存溢出或长时间使用内存很高的情况下,通过内存dump进行分析可以找出原因。

2.死锁

2.1 产生死锁的四个必要条件

互斥条件:一个资源一次只能被一个进程使用。

请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

不剥夺条件:进程已获得的资源,未使用完前,不能强行剥夺。

循环等待条件:若干进程间形成一种头尾相接的循环等待资源关系。

2.2 避免死锁的几个常见方法

避免一个线程同时获取几个锁

避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源

尝试使用定时锁来替代使用内部锁机制

3.资源限制

3.1 什么是资源限制

在并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。硬件资源限制有带宽的上传和下载速度、硬盘读取速度和CPU处理速度。软件资源限制有数据库的连接数和socket连接数等。

3.2 资源限制引发的问题

某段串行的代码并发执行时受到资源限制,仍然在串行执行,这样代码运行速度反而会更慢,因为增加了上下文切换和资源调度的时间。

3.3 如何解决

对于硬件资源限制,可考虑采用集群并行执行程序,让程序在多机上运行。对于软件资源限制,可以考虑使用资源池将资源复用。在资源限制的情况下,根据不同的资源限制调整程序的并发度,可让程序执行得更快。

猜你喜欢

转载自www.cnblogs.com/cy708/p/10054925.html