在并发编程中,Hapens-之前的原则是我们必须掌握的。今天,我们将在今天详细介绍同时编程中的Hapens之前。
在我们正式介绍Hapens之前的原则之前,让我们看一下段落。
【示例i】
以上示例来自:http://www.cs.umd.edu/~pugh/java/memorymodel/jsr-133-faq.html#finalwrong
在这里,假设线程A执行writer()方法,根据挥发性,v = true将写入v = true;线程B执行读取器()方法,根据挥发性,线程B将从内存中读取变量v。变量v为True,那么此时变量x的值是多少?交叉点?
该示例程序的直觉是x的值为42。实际上,x的特定值与JDK版本有关。如果使用的JDK版本小于1.5,则X的值可能为42或0。如果您使用JDK的版本为1.5和1.5,则X的值为42。
当您看到这个问题时,有人会问问题?为什么这是?事实上,答案是在JDK 1.5版本中介绍Java内存模型中的Hapens-Fore-Foreal原理。
接下来,我们将案例程序结合起来,以解释Java内存模型中的Hapens-Fore-Foreal原理。
按照代码的顺序,在任何操作中,Hapens的操作的先前操作。
例如,[示例1]中的程序x = 42将在v = true之前执行。该规则与单个线程思维更一致:在同一线程中,必须在前面的程序进行修改。关注 - 操作。
对于挥发性变量写作操作,Hapepens-将来会读取此变量读取操作。
换句话说,使用挥发性变量的写作操作首先发生在此变量的阅读操作中。这要求每个人都能理解。
如果在b和b hapens之前发生了c,则是c。
我们将[原理1],[原理2]和[原理3]结合在一起,以查看[示例1]程序。目前,我们可以得出以下结论:
(1)x = 42 happys-之前写入变量v = true,符合[原理1]程序顺序规则。
(2)写变量v = true快乐,读取变量v = true,符合[原理2]挥发性变量规则。
根据[原理3]传输规则,我们可以得出结论,x = 42 hapens-之前读取变量v = true。
换句话说,如果线程b读取v = true,则x = 42的x = 42集由线程a可见。
实际上,Java 1.5版本的Java.util.concurrent并发工具依赖于挥发性语义来实现可见性。
在锁定操作的操作之前发生,然后是该锁的锁定操作。
例如,输入同步代码块后,以下代码将自动释放锁定。执行代码块后,将自动释放锁定。
【示例2】
我们可以理解此程序:假设变量X的值为10,则线程A执行同步代码块以将X变量的值更改为10并释放同步锁定。线程B进入同步代码块时,您可以获取线程A到X变量的写作操作,也就是说,线程B访问的X变量的值为10。
如果螺纹A调用线程B的启动()方法启动线程B,则start()在线程B中操作。
我们还可以以这种方式理解线程启动规则:线程A启动线程B后,线程B可以在启动线程B之前看到线程A的操作。
让我们看下面的代码。
【示例iii】
以上代码是在线程A中执行的代码片段线程B访问。该位置的X变量值为100。
线程A等待线程B完成(线程A中的线程B的JOIN(JOIN()方法),当线程B完成时(线程A呼叫A JOIN(线程B)方法的JOIN()方法),然后螺纹A可以访问线程B配对变量操作。
例如,在Walter A中执行以下操作。
【示例4】
在中断线程的代码上调用中断线程中断的中断事件。
例如,以下程序代码。在中断线程b中中断b中,在线程a中中断,共享变量x的值修改为100,当线程b检测中断事件时,x变量访问的值为100。
【示例5】
对象的初始化启动了Happy finalize()方法的开始。
例如,以下程序代码。
【示例6】
运行结果如下所示。
本文分享了华为的真诚云社区,作者:宾赫。