Java并发编程的艺术总结

1. 并发编程面临的挑战

并发编程的目的:为了让程序运行的更快

1.1 上下文切换

时间片:CPU分配给各个线程的时间(几十毫秒)

CPU通过时间片分配算法来循环执行任务,当上一个任务执行一个时间片后会切换到下一个任务。在进行上下文切换之前,会保存上一个任务的状态,以便下次切换回这个任务时,可以在加载这个任务的状态,任务从保存到再加载的过程就是一次上下文切换

与串行执行相比,多线程不一定会快,因为线程有创建和上下文切换的开销

1.1.1 减少上下文切换

1)无锁并发编程:多线程竞争锁时,会引起上下文切换,可以避免使用锁,例如:不同线程处理不同段的数据

2)CAS算法:CAS(CompareAndSwap),比较并替换。CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。原子操作不需要加锁。

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

4)使用协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。一种比线程更加轻量级的存在,正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。协程不是被操作系统内核所管理,而完全是由程序所控制。Java的原生语法中并没有实现协程(某些开源框架实现了协程,但是很少被使用)

1.2 死锁

避免死锁的方法

1)避免一个线程同时获取多个锁

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

3)使用定时锁(lock.tryLock(timeout))

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

1.3 资源限制

资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件或软件资源。 

解决:硬件(使用集群并行执行程序);软件(使用资源池将资源复用)

 

小结:本章主要说了并发编程会遇到的三个问题,并一一阐述了概念以及解决的方法

2. Java并发机制的底层实现原理

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章