博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
不要依赖于线程调度器(72)
阅读量:6437 次
发布时间:2019-06-23

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

hot3.png

多个线程可运行时,

  • 线程调度器决定哪些线程将会被运行、以及运行多长时间
  • 任何操作系统在处理该问题时,会 尽力做到公正,但是策略却大相径庭
  • 编写良好的程序不要依赖这种策略细节,否则程序将不可移植

要编写健壮、可移植、响应良好的多线程程序,线程数量不要明显多于处理器核数

让每个线程做有意义的工作,

  • 不要处在不必要的可运行状态
  • 规定线程池大小、不宜太小,否则线程分配开销影响性能
  • 任务保持适当的小,保持独立

线程不应该一直处于一个 (busy - wait)的状态

  • 反复检查一个共享对象
  • 极端例子,countDownLatch 的不正当重新实现:
  • await 方法死循环等待

7d2759b49823d77ce1f04223fa7b37cdf00.jpg

如果某个程序不能工作,是由于无法获得足够的cpu时间,

  • 不要企图使用 Thread.yield
    • 因为在jvm 中,yield的表现差别很大
  • 更好的策略是减少可并发运行线程数量

调整线程优先级也是java平台最不可移植的特征

  • 采用次方法解决活性问题不合理,因为依然会再次出现

Thread.sleep(1) 在测试期间增加程序并发性,代替了Thread.yield

  • Thread.sleep(0) 会直接返回,请不要使用

总结:

  • 不要让程序的正确性依赖于调度器
    • 否则,程序不健壮、可移植性差
  • 作为推论,不要使用Thread.yield或线程优先级
    • 这些指令仅仅对调度器做些暗示
  • 优先级能够提高一个能够正常工作的程序的服务质量
    • 但不能“修复” 原本不能工作的程序

转载于:https://my.oschina.net/u/3847203/blog/2989438

你可能感兴趣的文章
第六周网络攻防作业
查看>>
springboot 项目部署为war项目
查看>>
【MongoDB】2、安装MongoDB 2.6.1 on Unbuntu 14.04(学习流水账)
查看>>
iOS中AVFoundation的简单使用—音乐的播放
查看>>
win10 家庭版 CredSSP加密Oracle修正 设置方法
查看>>
在spring中使用自定义注解注册监听器
查看>>
Kalileo中DiagramGroup布局
查看>>
[转载] 大道至简:软件工程实践者的思想——第十章 是思考还是思想
查看>>
【Spring MVC】 maven pom.xml 错误: Cannot upgrade/downgrade to Dynamic Web Module 3.0 facet.
查看>>
我的友情链接
查看>>
Android:简易单词本(三)
查看>>
使用SCVMM2012从hyper-v 2.0平台往hyper-v 3.0平台迁移VM虚拟机的报错(2)
查看>>
RocketMQ的安装与配置
查看>>
Android studio 单元测试
查看>>
LINUX--特殊权限SUID,SGID,Sticky
查看>>
Java基础学习总结(1)——equals方法
查看>>
使用 MYSQLBINLOG 来恢复数据
查看>>
DB2更改数据文件路径
查看>>
嵌入式Linux裸机开发(六)——S5PV210时钟系统
查看>>
大型网站技术架构(二)架构模式
查看>>