相关疑难解决方法(0)

解释Java并发中的"程序顺序规则"

程序顺序规则指出"线程中的每个操作都发生在 - 在程序顺序中稍后出现的该线程中的每个操作之前"

1.I读取另一个线程,一个动作

  • 读取和写入变量
  • 锁定和解锁显示器
  • 开始和加入线程

这是否意味着可以按顺序更改读取和写入,但读取和写入不能使用在第2行或第3行中指定的操作更改顺序?

2."程序顺序"是什么意思?

对示例的解释将非常有用.

其他相关问题

假设我有以下代码:

long tick = System.nanoTime(); //Line1: Note the time
//Block1: some code whose time I wish to measure goes here
long tock = System.nanoTime(); //Line2: Note the time
Run Code Online (Sandbox Code Playgroud)

首先,它是一个单线程应用程序,以保持简单.编译器注意到它需要检查两次时间并且还注意到与周围时间注释行没有依赖关系的代码块,因此它看到了重新组织代码的可能性,这可能导致Block1不被定时调用所包围在实际执行期间(例如,考虑此顺序Line1-> Line2-> Block1).但是,作为程序员,我可以看到Line1,2和Block1之间的依赖关系.Line1应紧接在Block1之前,Block1需要有限的时间才能完成,并且Line2立即成功.

所以我的问题是:我是否正确测量了块?

  • 如果是,那么是什么阻止了编译器重新排列顺序.
  • 如果不是,(通过Enno的回答后认为是正确的)我该怎么做才能防止它.

PS:我最近在SO中提出的另一个问题偷了这个代码.

java concurrency java-memory-model

13
推荐指数
2
解决办法
3021
查看次数

如何理解发生 - 在一致之前

JLS的第17章中,它引入了一个概念:发生在一致之前.

如果对于A中的所有读取r,其中W(r)是r看到的写入动作,那么一组动作A发生 - 在一致之前,不是hb(r,W(r))或那里的情况在A中存在写w,使得wv = rv和hb(W(r),w)和hb(w,r)"

在我的理解中,它等于以下几个词:...,既不是......也不是......

所以我的前两个问题是:

  • 我的理解对吗?
  • "wv = rv"是什么意思?

它还给出了一个例子:17.4.5-1

Thread 1 Thread 2

B = 1; A = 2; 

r2 = A; r1 = B; 
Run Code Online (Sandbox Code Playgroud)

在第一个执行顺序中:

1: B = 1;

3: A = 2;

2: r2 = A;  // sees initial write of 0

4: r1 = B;  // sees initial write of 0
Run Code Online (Sandbox Code Playgroud)

订单本身已经告诉我们两个线程交替执行,所以我的第三个问题是:左数是什么意思?

在我的理解中,r2和r1的原因可以看出0的初始写入是A和B都不是volatile字段.所以我的第四个问题是:我的理解是否正确?

在第二个执行顺序中:

1: r2 = A;  // sees write of A = 2

3: r1 = B;  // sees …
Run Code Online (Sandbox Code Playgroud)

java memory-model

11
推荐指数
2
解决办法
4350
查看次数