站长工具在线平台,网站标签设置,百度服务电话6988,深圳华强北二手手机目录
1.上下文的切换
1.1 什么是上下文切换
2. 并发编程的死锁问题
2.1 死锁产生的原因
2.2 避免死锁的方法
3.资源限制的挑战3.1 什么是资源限制 并发编程的目的是为了让程序更快#xff0c;大家都知道并不是开启的线程越多越快#xff0c;因为开启的线程越多随即面临…目录
1.上下文的切换
1.1 什么是上下文切换
2. 并发编程的死锁问题
2.1 死锁产生的原因
2.2 避免死锁的方法
3.资源限制的挑战3.1 什么是资源限制 并发编程的目的是为了让程序更快大家都知道并不是开启的线程越多越快因为开启的线程越多随即面临的挑战也越多比如上下文的切换、死锁问题、以及硬件和软件资源的限制问题。
1.上下文的切换
1.1 什么是上下文切换 学习操作系统的时候都了解到单核处理器也支持多线程执行代码CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间因为时间片非常短所以CPU通过不停地切换线程执行让我们感觉多个线程是同时执行的时间片一般是几十毫秒(ms)。 CPU通过时间片分配算法来循环执行任务当前任务执行一个时间片后会切换到下一个任务。但是在切换前会保存上一个任务的状态以便下次切换回这个任务时可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。
1.2 如何减少上下文切换 减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。
1. 无锁并发编程。多线程竞争锁时会引起上下文切换所以多线程处理数据时可以用一些办法来避免使用锁如将数据的ID按照Hash算法取模分段不同的线程处理不同段的数据。 2.CAS算法。Java的 Atomic包使用CAS算法来更新数据而不需要加锁。
3.使用最少线程。避免创建不需要的线程比如任务很少但是创建了很多线程来处理这样会造成大量线程都处于等待状态。
4.协程:在单线程里实现多任务的调度并在单线程里维持多个任务间的切换
2. 并发编程的死锁问题
2.1 死锁产生的原因 资源竞争 多个线程需要使用相同的资源并且这些资源只能被一个线程一次性占用。如果一个线程获取了资源A另一个线程获取了资源B并且两个线程都在等待对方的资源就会发生死锁。 资源请求和保持 一个线程已经持有一个资源并且在等待获取另一个资源时不释放已经持有的资源。 资源不可抢占 资源不能被强制从一个线程中抢占。只有线程自己才可以主动释放已持有的资源。 循环等待 存在一个线程循环等待资源的情况例如线程A等待线程B持有的资源而线程B又等待线程A持有的资源。
2.2 避免死锁的方法 避免嵌套锁一个线程获取多个锁 尽量避免一个线程在持有一个锁的同时再去请求另一个锁。可以通过减少锁的使用来避免死锁。 使用超时 在获取锁的时候设置超时如果超过一定时间没有获取到锁就放弃请求该锁。这样可以避免线程无限期地等待下去。 if (lock.tryLock(10, TimeUnit.SECONDS)) {try {// critical section} finally {lock.unlock();}
} else {// perform alternative action
}3.尽量缩短锁的持有时间尽量缩短持有锁的时间只在必要的地方加锁减少在锁内执行的操作
3.资源限制的挑战
3.1 什么是资源限制 资源限制是指在进行并发编程时程序的执行速度受限于计算机硬件资源或软件资源例如服务器的带宽只有 2Mbs某个资源的下载速度是1Mb/s每秒系统启动10个线程下载资源下载速度不会变成10Mb/s所以在进行并发编程时要考虑这些资源的限制。硬件资源限制有带宽的上传/下载速度、硬盘读写速度和CPU的处理速度。软件资源限制有数据库的连接数和socket 连接数等。
3.2 资源限制引发的问题 在并发编程中将代码执行速度加快的原则是将代码中串行执行的部分变成并发执行但是如果将某段串行的代码并发执行因为受限于资源仍然在串行执行这时候程序不仅不会加快执行反而会更慢因为增加了上下文切换和资源调度的时间。例如之前看到-段程序使用多线程在办公网并发地下载和处理数据时导致CPU利用率达到100%几个小时都不能运行完成任务后来修改成单线程一个小时就执行完成了。 强烈建议如果并发程序写的不严谨出现问题定位起来比较耗时和棘手java开发工程师尽量还是多使用JDK并发包提供的并发容器和工具类来解决并发问题。比较jdk大叔的水平可是经历 了历史的检验