St.*_*rio 9 java multithreading java-memory-model
我正在尝试理解Java 发生 - 在订单概念之前,有一些东西看起来很混乱.据我所知,之前发生的只是行动集上的一个订单,并没有提供有关实时执行订单的任何保证.实际上(强调我的):
应该注意的是,两个动作之间存在的先发生关系并不一定意味着它们必须在实现中以该顺序发生.如果重新排序产生的 结果与合法执行一致,则不是非法的.
因此,所有它说的是,如果有两个动作w(写)和r(读),使得HB(W,R) ,较r 可能实际发生之前,w在执行,但不能保证它会的.w读取也会观察到写入r.
我如何确定在运行时随后执行两个操作?例如:
public volatile int v;
public int c;
Run Code Online (Sandbox Code Playgroud)
操作:
Thread A
v = 3; //w
Thread B
c = v; //r
Run Code Online (Sandbox Code Playgroud)
这里我们有,hb(w, r)但这并不意味着在分配后c会包含价值3.如何强制执行c3?同步订单是否提供此类保证?
Sol*_*low 13
当JLS说,在线程A的一些事件X确立了之前发生在线程B与事件Ÿ关系,这并不意味着X将Y.之前发生
这意味着,如果 X发生之前Y,那么这两个线程将同意该X发生前Y.也就是说,两个线程会看到在与Y.前X发生一致的状态下,程序的内存
这都是关于记忆的.线程通过共享内存进行通信,但是当系统中有多个CPU时,所有CPU都试图访问同一个内存系统,那么内存系统就成了瓶颈.因此,允许典型的多CPU计算机中的CPU延迟,重新排序和高速缓存存储器操作以加快速度.
当线程没有彼此交互时,这很有用,但是当它们实际上想要交互时它会导致问题:如果线程A将值存储到普通变量中,Java不能保证线程B 何时(或者甚至是否)会看到价值变化.
为了在重要时克服这个问题,Java为您提供了同步线程的某些方法.也就是说,让线程同意程序内存的状态.所述volatile关键字和synchronized关键字是线程之间建立同步的两种手段.
我认为他们称之为"之前发生"的原因是为了强调关系的传递性:如果你能证明A在B之前发生,并且你可以证明B发生在C之前,那么根据JLS中规定的规则,你已经证明A发生在C之前.