use*_*937 12 java multithreading synchronization java-memory-model
我试着理解为什么这个例子是一个正确同步的程序:
a - volatile
Thread1:
x=a
Thread2:
a=5
Run Code Online (Sandbox Code Playgroud)
因为存在冲突的访问(存在对a的写入和读取)所以在每个顺序一致性执行中必须发生 - 在该访问之间的关系之前.假设一个顺序执行:
1. x=a
2. a=5
Run Code Online (Sandbox Code Playgroud)
1发生在2之前,为什么?
如果你有一个volatile变量a,一个线程正在从中读取而另一个线程正在写入它,那么这些访问的顺序可以是任意顺序.这是一场竞争.这取决于首先启动的操作.
写入可能刚刚发生,读取看到更新的值.或者写入可能在读取后发生.所以x可以是或者5之前的值a.
每个顺序一致性执行必须在该访问之间的关系之前发生
你在这里误导了.随着"关系之前发生" volatile意味着所有以前的记忆更新之前,无论是读或一个写volatile变量,保证完成.因此,两个线程都具有"之前发生"保证,但这绝不能解释两个volatile访问如何相互作用.这取决于竞争条件.读者可以保证看到写入,但前提是写入发生在读取之前.
不,在(按同步顺序)对同一变量的易失性写入之前的易失性读取不一定发生在易失性写入之前。
这意味着它们可能处于“数据竞争”中,因为它们是“冲突的访问,而不是按发生之前的关系排序”。如果这是真的,几乎所有程序都包含数据竞争:) 但这可能是规范错误。不应该将易失性读取和写入视为数据竞争。如果程序中的所有变量都是易失性的,则所有执行都是简单的顺序一致的。见http://cs.oswego.edu/pipermail/concurrency-interest/2012-January/008927.html
| 归档时间: |
|
| 查看次数: |
1154 次 |
| 最近记录: |