java内存模型及并发技术.ppt

  1. 1、本文档共54页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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()

文档评论(0)

celkhn5460 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档