1.并发编程的起点
一、上下文切换
CPU不停地切换线程执行,我们感觉多个线程是同时执行的,实际是来回切换时间片达到的,时间片的切换一般是 几十毫秒(ms)
1.1、如何减少上下文的切换
减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程、使用协程
- 1、无锁并发编程。
多线程竞争锁的时,会引起上下文的切换,所以多线程在处理数据时,可以用一些办法来避免使用锁。如:将数据的ID按照Hash算法取模分段,不同的线程处理不同的段。(好像分段锁呀。)
- 2、CAS算法。
java的Atomic包使用的CAS算法来更新数据,而不需要加锁
- 3、使用最少线程。
避免创建过多的线程,比如任务很少,却创建了很多的线程来处理,这样会造成大量的线程都处于等待状态。
- 4、协程。
在单线程里面实现多线程的调度,并在单线程里维持多个任务间的切换。
1.2、避免死锁
-
避免一个线程同时获取多个锁。
-
避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
-
尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。
-
对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况
1.3、产生死锁的四个必要条件
1.互斥条件:一个资源每次只能被一个进程使用。
2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。