Java 内存模型
java-memory-model-fefe.png由上图可知,在此内存模型下,线程的工作空间local memory 和主内存是独立的,由于每个线程都是在自己的工作空间中运行,如果出现线程A修改了变量a的值,但没有及时写回到主内存的话。后续的线程b从主内存中读取到的变量a的值就仍旧是一个老值(stale value)。由此带来了线程安全性问题。
happens-before
happens-before是JMM(Java Memory Model)为保证线程安全性,而提供的一种排序规则。JVM遵循此规则以实现原子性和内存可见性,从而保证线程安全性。
happens-before规则
-
1 、 Each action in a thread happens-before every action in that thread that comes later in the program order
即: 在单个线程中,语句的编程顺序就是他们的执行顺序。 -
2、An unlock on a monitor happens-before every subsequent lock on that same monitor
解锁操作要位于后续的加锁操作之前。
:
没解锁,说明某个线程还没有执行完临界区的代码,所以后续的加锁请求
亦即:后续的进入临界区的请求,是不能被允许的。 -
3、A write to a volatile field happens-before every subsequent read of that same volatile
对volatile变量的写入操作要位于后续的读取该volatile变量的请求之前。这样做的目的,就保证了volatile的内存可见性,一旦volatile类型的变量的写入操作完成,就立马把它写入到主内存中。这样就保证了后续的读取操作,就一定会读取到最新的写入值。
-
4、A call to Thread.start() on a thread happens-before any actions in the started thread
Thread.start()调用位于已启动线程的任何操作之前执行。 -
5、All actions in a thread happen-before any other thread successfully returns from a Thread.join() on that thread
传递性:如果 A happens- before B,且 B happens- before C,那么 A happens- before C
网友评论