问题描述
我的问题有人提过,但是侧重点有不同,而且没人回答过:http://www.iteye.com/problems/54095jsr133里面定义到happens-before规则之一:“Each action in a thread happens-before every subsequent action in that thread.”,翻译过来就是:“线程中的每个操作都happens-before这个线程中后续的所有操作。”我们都知道为了效率问题,在编译,JIT和缓冲区这几个地方可能会发生代码的重排序问题。但是前面的happens-before的规则如果是这样的理解的话是禁止了重排序到发生。这很显然是有问题的。如上对happens-before的理解肯定是有问题的,所以,希望有兄弟能解释下这个happens-before规则到真正含义是什么? 问题补充:freish 写道
解决方案
我的理解是happens-before定义了几条规则,只有做了适当同步的代码才会遵循这几条规则,并不是所有的代码都遵循这个规则,如你提到的重排序问题
解决方案二:
有一个疑问,如果只有正确的同步的程序才具有happens-before关系,那怎么保证单线程程序在乱序的情况下结果是确定的?
解决方案三:
引用是不是因果关系反了? 做了适当同步的代码才会遵循这些happens-before规则,还是遵循了happens-before规则才算是适当同步的代码?不管这个因果关系吧,可以肯定的一点是,需要同步(包括synchronized关键字、volatile变量、final变量、java.util.concurrent.locks等)才能保证这样的关系
解决方案四:
由类库提供的具有happends-before关系的有:Placing an item in a thread-safe collection happens-before another thread retrieves that item from the collection;Counting down on a CountDownLatch happens-before a thread returns from await on that latch;Releasing a permit to a Semaphore happens-before acquiring a permit from that same Semaphore;Actions taken by the task represented by a Future happens-before another thread successfully returns from Future.get;Submitting a Runnable or Callable to an Executor happens-before the task begins execution; andA thread arriving at a CyclicBarrier or Exchanger happens-before the other threads are released from that same barrier or exchange point. If CyclicBarrier uses a barrier action, arriving at the barrier happens-before the barrier action, which in turn happens-before threads are released from the barrier.
解决方案五:
The JMM defines a partial ordering called happens-before on all actions within the program. To guarantee that the thread executing action B can see the results of action A (whether or not A and B occur in different threads), there must be a happens-before relationship between A and B. In the absence of a happens-before ordering between two operations, the JVM is free to reorder them as it pleases.A data race occurs when a variable is read by more than one thread, and written by at least one thread, but the reads and writes are not ordered by happens-before. A correctly synchronized program is one with no data races; correctly synchronized programs exhibit sequential consistency, meaning that all actions within the program appear to happen in a fixed, global order.综上,只有正确同步的程序才具有happens-before关系