- 1、本文档共54页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
java内存模型及并发技术
StringBuffer是线程安全的,但是使用和共享StringBuffer的多线程代码不是安全的代码 * * * Volatile变量的内存模型分析 旧的内存模型:保证读写volatile都直接发生在main memory中,线程的working memory不进行缓存 —— 仅仅保证这些volatile使用的价值和意义不大 在新的内存模型下对volatile的语义进行了修补和增强 如果当线程 A 写入 volatile 变量 V 而线程 B 读取 V 时,那么在写入 V 时,A 可见的所有变量值现在都可以保证对 B 是可见的。结果就是作用更大的 volatile 语义,代价是访问 volatile 字段时会对性能产生了一点点的影响。(A volatile var write happens-before read of the var) Volatile变量的内存模型分析 volatile 的旧语义只承诺正在读和写的变量的可见性,仍然参与排序。这样导致排序问题。新的内存模型修补了这一点 实际上,对 volatile 字段的每一次读或者写都像是“半个”同步。 对 volatile 的读有与monitor enter的内存语义 对 volatile 的写有与monitor exit的同样的语义 Volatile变量的内存模型分析 stop用volatile修饰来保证写可见性 class Task implements Runnable { private volatile boolean stop = false; public void stop() { stop = true; } public void run() { while (!stop) runTask(); try { Thread.sleep(100); } …; } private void runTask() { /*...*/ } } Volatile变量的内存模型分析 ready用volatile修饰来保证写可见性 使用valatile volatile 变量++操作不是原子行为 volatile int x= 1; … x++;//不是一个原子操作,需要多条指令 Volatile 变量比 synchronization要便宜很多 在jdk5中推荐采用 util.concurrent.atomic 工作机制类似Volatile 同时提供了简单运算的原子行为 并发程序设计的几个策略 如何安全可靠取消正在执行的任务 如何安全可靠结束正在执行的线程 如何处理InterruptedException 并发程序设计的几个策略 为什么需要取消正在执行的任务 User-requested cancellation Time-limited activities Application events Errors Shutdown Java没有提供安全的强迫立即执行的方法 Java提供了一种协商的机制:Interruption Interruption的设计策略 How: 其他线程如果发起中断请求 When 何时检测正在执行的任务被请求中断 What 如何响应中断请求 ----下面看一个简单的例子 例子:这样做有何缺点? class Task implements Runnable { private volatile boolean stop = false; public void stop() { stop = true; }//how // when public void run() { while (!stop){ runTask(); } try { Thread.sleep(100); } …; } private void runTask() { … } } 例子分析 问题: polling loops,只有一个检查点 线程不能立刻结束,要等到检测的时候 遇到Blocking method有可能无法中止 检查的变量必须是volatile修饰的 一个更好的方法:Interruption 礼貌地劝告另一个线程在它愿意并且方便的时候停止它正在做的事情。 Thread中断状态(interrupted status) 线程的一个内部属性 类型:boolean 初始值:false. Terrupt():设置interrupted status 为true ---- How?When?What? interruption Policy 分析 How Terrupt()方法. interrupt()
您可能关注的文档
最近下载
- 2024年职业院校技能大赛(新能源汽车维修赛项)考试题库(院校下发版) .docx VIP
- 建筑工程施工全过程跟踪审计实施方案.pdf
- AI助力英语高效课堂教学与个性化学习课件.pptx VIP
- 中国血脂管理指南(2023+年).pdf VIP
- 地下停车场车库设计规范.doc VIP
- 国家能源集团电力产业技术监督实施细则-第1部分 火电产业绝缘技术监督.pdf VIP
- 2025年吉林省初中学业水平考试(中考)语文真题(含答案).docx VIP
- 健身拉伸知识PPT课件.pptx VIP
- 地下停车场设计规范方案.pdf VIP
- Unit 4 Healthy food教案 人教PEP英语(2025)三年级下册.docx VIP
文档评论(0)