Java并发编程的挑战
2018-07-26 19:57
295 查看
并发编程的目的是为了让程序运行得更快,但是,并不是线程启动的越多,就能让程序最大限度地并发执行。并发编程时,会面临非常多的挑战,比如上下文切换的问题,死锁的问题,以及受限于各种硬件和软件的资源限制问题。
CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载到这个任务的状态。从任务保存到再加载的过程就是一次上下文切换。
vmstat 1#vmstat可以测试上下文切换的次数。输出结果里的CS(Content Switch)即表示上下文切换的次数。
减少上下文切换的方法有:无锁并发编程,CAS算法,使用最少线程,使用协程。
使用最少线程:避免创建不需要的线程,比如任务很少,却创建了很多线程来处理,造成大量线程都处于等待状态(WAITING)。
协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。
硬件资源限制有带宽的上传/下载速度、硬盘读写速度和CPU的处理速度。软件资源限制有数据库的连接数和socket连接数等。
如何解决资源限制的问题?
对于硬件限制,可以考虑使用集群并行地执行程序。例如使用Hadoop集群,不同的机器处理不同的数据。可以通过“数据ID%机器数”,计算得到一个机器编号,然后由对应编号的机器处理这笔数据。
对于软件限制,可以考虑使用资源池将资源复用。比如使用连接池将数据库和socket连接复用。
相关文章推荐
- Java并发编程的艺术-第一章<并发编程的挑战>
- Java并发(二)—— 并发编程的挑战 与 并发机制的底层原理
- java并发编程的艺术【一】并发编程的挑战
- Java并发编程的艺术-第一章之并发编程的挑战
- Java并发编程的艺术读书笔记(1)-并发编程的挑战
- Java并发编程基础---(9)Java中的锁---队列同步器
- java 并发编程
- Java并发编程-同步(六)
- Java并发编程之Callable类和Future接口
- 转:【Java并发编程】之四:守护线程与线程阻塞的四种情况
- Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)
- 黑马程序员——Java多线程与并发编程
- 【Java并发编程】之二:线程中断(含代码)
- Java并发编程之:Vector和ArrayList的区别
- 【Java并发编程】之十一:线程间通信中notify通知的遗漏(含代码)
- 转:【Java并发编程】之八:多线程环境中安全使用集合API(含代码)
- Java并发编程:如何创建线程?
- 转:【Java并发编程】之二十二:并发新特性—障碍器CyclicBarrier(含代码)
- Java并发编程与技术内幕:ArrayBlockingQueue、LinkedBlockingQueue及SynchronousQueue源码解析
- 【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量