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.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

posted @ 2021-08-13 19:13  宋佳强  阅读(23)  评论(0编辑  收藏  举报