资源描述:
《最新JAVA技术内存模型》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、最新Java™技术内存模型java.sun.com/javaone/sfJeremyManson和WilliamPugh马里兰大学http://www.cs.umd.edu/~pugh1
2、2004JavaOneSMConference
3、SessionTS-2331听众•假设你熟悉基于Java™技术的线程(“Java™线程”)的基础知识─创建、启动和加入线程─同步─wait和notifyAll2
4、2004JavaOneSMConference
5、SessionTS-2331Java™线程规范•修订为JSR-133的一部分•属于以下规
6、范中的一部分─最新Java™语言规范─最新虚拟机规范•今天在此讨论是JDK™1.5版本中的功能─不是所有这些功能都能保证在以前版本中运行─突破以前的线程规范─禁止许多Java™虚拟机执行优化3
7、2004JavaOneSMConference
8、SessionTS-2331多线程系统中的安全问题•不要保留许多直觉假设•某些广泛使用的习惯用法并不安全─最初的双重检查锁定用法─检查用于线程结束的non-volatile标志•不能使用测试来检查错误─有些异常情况仅在某些平台上出现─例如,多处理器─异常情况很少并且不重复地出现4
9、2004J
10、avaOneSMConference
11、SessionTS-2331修订线程规范•Java™线程规范已历经重大修订─多数修订是为适当地规范现有行为─但行为方面有少数更改•目标─清晰并且易于理解─培植可靠的多线程代码─可供高性能的Java™虚拟机使用•已影响Java™虚拟机─以及已编写出的较差的现有代码─包括Sun的JDK部分5
12、2004JavaOneSMConference
13、SessionTS-2331本次演讲……•用Java™语言描述构建同步阻塞和并发程序─语言原语和util.concurrent抽象•说明正确同步化代码的意义•
14、尽力使你确信,关于不同步代码的智能推断几乎肯定可以是错误的─高效和可靠的程序不需要6
15、2004JavaOneSMConference
16、SessionTS-2331本次演讲……•我们将主要讨论─同步方法和阻塞─Volatile域•同一原则适用于JSR-166锁定和原子性操作•还将讨论final域和不可变性7
17、2004JavaOneSMConference
18、SessionTS-2331分类学•高级并发抽象─JSR-166和java.util.concurrent•低级锁定─synchronized()阻塞•低级原语─Volatile
19、变量,java.util.concurrent.atomic类─考虑非阻塞同步•数据争用:故意不完全同步─避免!─甚至DougLea也不能正确了解8
20、2004JavaOneSMConference
21、SessionTS-2331同步的三个方面•原子性─锁定以获得互斥•可见性─确保一个线程中对象域的更改在其它线程中可见•顺序性─确保对语句执行的顺序不会感到惊奇9
22、2004JavaOneSMConference
23、SessionTS-2331不要试图太聪明•人们担心同步的成本─尝试不使用同步,设计模式在线程之间进行通信─锁定、volat
24、ile或其它并发抽象•几乎不可能正确执行─无同步的线程内通信是不直观的10
25、2004JavaOneSMConference
26、SessionTS-2331测验时间x=y=0启动线程线程1线程2x=1y=1j=yi=x能得到i=0和j=0这样的结果么?11
27、2004JavaOneSMConference
28、SessionTS-2331答案:是!x=y=0启动线程线程1线程2x=1y=1j=yi=x如何得到i=0和j=0?12
29、2004JavaOneSMConference
30、SessionTS-2331这是如何发生的?•编译器可以对语句
31、重新排序─或者保持寄存器中的值•处理器可以对其重新排序•在多处理器中,值不能在全局存储器中同步•内存模型的设计旨在允许强力优化─包括尚未实现的优化•对性能有益─对有关不充分的同步代码的直觉不利13
32、2004JavaOneSMConference
33、SessionTS-2331正确性和优化•根据你认为系统必须按照的顺序而设计的巧妙代码在Java语言中几乎总是错误的•Dekker的算法(第一个正确锁定实现)要求此顺序─在Java语言中不能运行,使用提供的锁定•必须使用同步来加强可见性和顺序性─以及互斥─如果你正确使用同步,那么你不会看
34、到重新排序14
35、2004JavaOneSMConference
36、SessionTS-2331同步操作(近似)//blockuntilobtainlocksynchronized(anObject){//getmainmemoryvalueoffield1andf