使用多线程遇到的问题

 

1、上下文切换

    CPU通过时间片分配算法来循环执行任务,当前任务执行-一个时间片后会切换到下一个任务。

    但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。

    所以任务从保存到再加载的过程就是一次上下文切换。

  解决方式:

    减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。

 

2、死锁

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

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

  尝试使用定时锁,使用lock.tryLock(imeout)来替代使用内部锁机制。

  对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

 

3、资源限制的挑战

    线程不是说越多越好

  方法就是,

    根据不同的资源限制调整程序的并发度,比如下载文件程序依赖于两个资源带宽和硬盘读写速度。

    有数据库操作时,涉及数据库连接数,如果SQL语句执行非常快,而线程的数量比数据库连接数大很多,则某些线程会被阻塞,等待数据库连接。

 

 

 

 

https://baijiahao.baidu.com/s?id=1674003930734516720&wfr=spider&for=pc

posted @ 2021-10-24 16:14  抽象Java  阅读(116)  评论(0编辑  收藏  举报