java并发编程面临的问题

来源:互联网 发布:淘宝网裙子 编辑:程序博客网 时间:2024/06/09 14:29
并发编程的目的是为了让程序运行的更快,但是并不是启动更多的线程就能让程序最大限度地并发执行。
java并发编程面临的问题:
一、上下文切换问题:任务从保存到再加载的过程就是一次上下文切换
(1)使用Lmbench3可以测量上下文切换的时长。
(2)使用vmstat可以测量上下文切换的次数。
减少上下文切换的方法:
1、无锁并发编程。 多线程竞争锁时, 会引起上下文切换, 所以多线程处理数据时, 可以用一些办法来避免使用锁, 如将数据的ID按照Hash算法取模分段, 不同的线程处理不同段的数据。
2、CAS算法。 Java的Atomic包使用CAS算法来更新数据, 而不需要加锁。
3、使用最少线程。 避免创建不需要的线程, 比如任务很少, 但是创建了很多线程来处理, 这样会造成大量线程都处于等待状态。
4、协程: 在单线程里实现多任务的调度, 并在单线程里维持多个任务间的切换。
二、死锁
     当两个线程相互等待对方释放同步监视器时就会发生死锁,一旦出现死锁,整个程序既不会发生任何异常,也不会给出任何提示,只是所有线程处于阻塞状态,无需继续。当出现死锁时,只能通过dump线程查看到底是哪个线程出现了问题。
避免死锁的方法
1、避免一个线程同时获取多个锁。
2、避免一个线程在锁内同时占用多个资源, 尽量保证每个锁只占用一个资源。
3、尝试使用定时锁, 使用lock.tryLock(timeout) 来替代使用内部锁机制。
4、对于数据库锁, 加锁和解锁必须在一个数据库连接里, 否则会出现解锁失败的情况。
三、资源限制
     资源限制是指在进行并发编程时, 程序的执行速度受限于计算机硬件资源或软件资源。在并发编程中, 将代码执行速度加快的原则是将代码中串行执行的部分变成并发执行, 但是如果将某段串行的代码并发执行, 因为受限于资源, 仍然在串行执行, 这时候程序不仅不会加快执行, 反而会更慢, 因为增加了上下文切换和资源调度的时间。
解决资源限制的方法:
1、对于硬件资源限制, 可以考虑使用集群并行执行程序。 既然单机的资源有限制, 那么就让程序在多机上运行。
2、对于软件资源限制, 可以考虑使用资源池将资源复用。 比如使用连接池将数据库和Socket连接复用, 或者在调用对方webservice接口获取数据时, 只建立一个连接。在资源限制情况下进行并发编程的方法是根据不同的资源限制调整程序的并发度。
1 0
原创粉丝点击