Java内存模型一记

什么是内存模型?

Java内存模型(JMM)是通过各种操作来定义的,包括对变量的读/写操作,监视器的加锁和释放操作,线程的启动和合并操作。

俗称Happens-Before,规则很多条,比如:

程序顺序规则

如果程序中操作A在操作B之前,那么在线程中A操作将在B操作之前执行。

volatile变量规则:

对volatile变量的写入操作必须在对该变量的读操作之前执行。这样可以确保每个线程读到的变量的值,都是已经被更新后的值。

监视器锁规则:

在监视器锁上的解锁操作必须在同一个监视器锁上的加锁操作之前执行。

JMM规定了JVM必须遵循的一组最小保证,这组保证规定了对变量的写入操作在何时将对于其他线程可见。

为什么需要它?

为了提升性能,程序上会采用多线程,编译器会对指令重排序等方式,这导致一个线程A读取变量var,而另一个线程B对变量var进行写入,这两个操作存在结果不确定性,在没有正确使用同步时。

比如:

aVar++;// 对变量自增

上面这行代码包含三个操作:读取aVar的值——加一计算——对aVar赋值;

在多线程环境下,如果不采用同步机制,结果就不是可预期的。

同步机制

可以借助同步机制,这样就能确保被同步的操作,在线程之间的操作是有序的,前一个线程操作后的结果,对后一个线程是立即可见的,这保证了竞态区的原子性与可见性。

volitile

该关键字确保了变量的可见性,但不能保证原子性。

发布了14 篇原创文章 · 获赞 1 · 访问量 933

猜你喜欢

转载自blog.csdn.net/hankesi/article/details/104150114