日期:2014-05-16 浏览次数:20415 次
在写线程池的时候,遇到了很多的问题,特别是happen-before应该怎么去理解,怎么去利用,还有reorder,哪些操作有可能会被reorder?在这一点上,发现其实《concurrent in practice》也没描述得太清晰。?
在网上搜了一遍,发现JSR133的faq相对而言,还算稍微解释了一下,发现JSR133其实也就40多页,所以也就顺带看了一遍,因为大部分的内容都比较简单(越往后看发现越复杂~),但是里面的定义比较难理解,所以只记录了定义和一些个人认为比较重要的地方,或者比较难理解的地方?
这里是阅读笔记,以备以后查阅?
前言部分?
1.下面的网站提供了附加的信息,帮助进一步地理解JSR133?
http://www.cs.umd.edu/~pugh/java/memoryModel/?
2.在JLS中很可能需要JVM(TM)实现的两个原始的定义的改变:?
一.introduction?
3.JSR133并不是描述多线程程序应该怎么去执行,而是描述多线程程序允许怎么去显示的,他包括一些规则,这些规则定义了一个被多线程更新的共享变量的值,是否是可见的。(比如读一个共享变量的值,根据规则,应该显示的是什么)?
4.还是synchronized的问题,该问题在之前的文章中也提到过,在方法上的时候,它锁的是this,如果是静态方法,那么锁的是方法所在类的class?
二.Incorrenctly Synchronized Programs Exhibit Surprising Behaviors?
5.不合适的同步(improperly synchronized):(注:并不意味着错误)
当发生这些,我们就说有数据竞争(data race),包含有数据竞争的代码,可能会出现一些违反直觉的结果。?
三.Informal Semantics?
6.正确的同步(correct synchronization)(严格地保证多线程访问的正确性,但吞吐率很低的)?
理解一个程序是否被正确地同步,有两个关键点:?
happens-before在第五章会更详细彻底地定义。?
Happens-before关系最主要是强调并定义了两个有竞争的动作之间的顺序(当数据竞争出现时)?
happens-before的规则包括:(注意,这些动作在直觉上是本该如此的,但在多线程中,就不一定了,所以才有这些规则)?
a.在这个线程中,每个动作happens-before每个之后的动作。?
b.一个对固有锁(monitor)的unlock操作happens-before每个之后的对monitor的lock操作。?
c.一个对volatile filed的写happens-before每个之后的对该volatile的读(注意,这里没有线程的限制)?
d.一个对线程的start()的调用(call)happens-before该线程中任何动作。?
e.在线程中的所有动作happens-before任何其他线程成功地调用对该线程的join()返回?
f.如果a happens-before b,b happens-before c,那么a happens-before c,即具有传递性?
这里有一个很有意思的图片,可能对别人没太多的意义,但对我自己而言,真是解释了不少以前的迷惑,最主要是第二幅图片的,之前有一个误解:数据只有在同步块中,而另一个线程必须也