Java并发编程的挑战

     并发编程的目的是为了让程序运行得更快,但是,并不是线程启动的越多,就能让程序最大限度地并发执行。并发编程时,会面临非常多的挑战,比如上下文切换的问题,死锁的问题,以及受限于各种硬件和软件的资源限制问题。

CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载到这个任务的状态。从任务保存到再加载的过程就是一次上下文切换。


vmstat 1#vmstat可以测试上下文切换的次数。输出结果里的CS(Content Switch)即表示上下文切换的次数。


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

使用最少线程:避免创建不需要的线程,比如任务很少,却创建了很多线程来处理,造成大量线程都处于等待状态(WAITING)。

协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。


硬件资源限制有带宽的上传/下载速度、硬盘读写速度和CPU的处理速度。软件资源限制有数据库的连接数和socket连接数等。


如何解决资源限制的问题?

  1. 对于硬件限制,可以考虑使用集群并行地执行程序。例如使用Hadoop集群,不同的机器处理不同的数据。可以通过“数据ID%机器数”,计算得到一个机器编号,然后由对应编号的机器处理这笔数据。

  2. 对于软件限制,可以考虑使用资源池将资源复用。比如使用连接池将数据库和socket连接复用。

相关文章
相关标签/搜索