博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发编程的挑战
阅读量:6071 次
发布时间:2019-06-20

本文共 695 字,大约阅读时间需要 2 分钟。

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

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

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

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

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

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

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

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

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

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

转载于:https://juejin.im/post/5c8b6a3b6fb9a049a571cb4e

你可能感兴趣的文章
setter 和 getter 方法的作用
查看>>
Java编程基础抽象类
查看>>
Linux性能测试实践
查看>>
Intellij IDEA SVN版本控制问题
查看>>
canvas 连线动画
查看>>
工欲善其事必先利其器 工具介绍
查看>>
MISP6: 细化迭代4:实现退货用例
查看>>
项目SOA化
查看>>
小烦躁
查看>>
韩都衣舍连个面试的机会也不给
查看>>
ubuntu下安装phpunit
查看>>
CCNA WAN ACL&NAT
查看>>
Android:menu
查看>>
傻瓜式操作Nagios
查看>>
除去文件中显示的^M符号
查看>>
关于rman备份保留策略“恢复窗口”的一点理解
查看>>
Java 编程的动态性, 第四部分: 用 Javassist 进行类转换
查看>>
JavaScript—数组reduce()方法详解及高级技巧(18)
查看>>
【ThinkPHP3.2.3】学习ThinkPHP笔记:搭建环境(1)
查看>>
MySQL数据库之多条件查询索引实现(项目中经常用到)
查看>>