Java volatile示例

时间:2020-02-23 14:37:17  来源:igfitidea点击:

在本教程中,我们将讨论Java volatile示例。

什么是Java易失性?

javavolatile关键字用于检查Java变量是否“被放入基本内存中”。更确切地说,对不可预测变量的每次读取都将从PC的主内存中读取,而不是从CPU储备中读取,并且每次与不稳定变量保持联系都将与基本内存保持联系,而不是简单地读到CPU存储。

事实上,由于Java5不稳定的口号确保了一些东西,而不是不可预测的因素被组合到基本内存中并从中读取。我将在相关领域澄清这一点。

java中如何使用volatile关键字?

什么是Java中的volatile变量?何时使用Java中的volatile变量是Java访谈中一个众所周知的多字符串查询问题?尽管许多软件工程师认识到什么是易失性变量,但他们在第二部分却大做文章,例如在Java中使用volatile变量的地方,很少有人对Java中的volatile有一个明确的理解和动手操作。在这个教学练习中,我们将通过给出Java中volatile变量的一个简单例子来解决这个问题,并研究在Java中何时使用volatile变量。总之,Java中不可预测的流行语被用作Java编译器和线程的指针,这些编译器和线程不存储该变量的估计值,并从主内存中可靠地读取它。因此,如果我们需要共享任何因素,其中read和compose活动是通过执行来实现的,例如,在int或者boolean变量中读写,那么我们可以将它们声明为volatile变量。

从Java5到真正的变化,比如自动装箱、枚举、泛型和变量争用,Java对Java内存模型(JMM)进行了一些调整,它确保了对使用一个字符串到另一个字符串所产生的更改的可感知性,就像“以前发生的”一样,它处理了在一个字符串中发生的内存组合问题,可以“溢出”并被另一个字符串看到。

Java volatile关键字不能用于策略或者类,必须与变量一起使用。同样的,在任何Java关键字进入不稳定变量之前,任何Java关键字保持不稳定的读取都会发生在va5之前。通过路由,volatile关键字的使用同样会使编译器或者JVM从代码的重新排序或者在不结束它们的同步边界的情况下移动。

/**
 * Java program to demonstrate where to use Volatile keyword in Java.
 * In this example Singleton Instance is declared as volatile variable to ensure
 * every thread see updated value for _instance.
 * 
 * @author Javin Paul
 */
public class Singleton{
private static volatile Singleton _instance; //volatile variable 

public static Singleton getInstance(){

 if(_instance == null){
          synchronized(Singleton.class){
            if(_instance == null)
            _instance = new Singleton();
          }

 }
 return _instance;

}

如果我们没有使∗实例变量的易变性超过使Singleton成为case的线程不能传递其他字符串,那么这种情况一直持续到它离开Singleton方块,所以如果线程An正在生成Singleton case,并且在创建之后不久就失去了CPU,所有其他字符串可能不会观察到对\u实例的估计为not invalid,他们会相信它仍然无效。

Java易失性示例

为什么?由于peruser字符串不做任何保留,并且直到author string离开synchronized方块,内存将不会被同步,主内存中也不会刷新对\u实例的估计。对于Java中的Volatile关键字,这是由Java自己处理的,这样的更新将被所有peruser字符串注意到。

综上所述,与Java中的同步流行语不同,volatile关键字还用于在字符串之间传递内存的实质内容。

可变可见性问题

Java不稳定流行语确保了对字符串上的因子进行横向更改的可感知性。这听起来可能有点消化,所以给我一个机会扩展一下。

在多线程应用程序中,字符串处理非不稳定因素,由于执行原因,每个字符串可能会将基本内存中的因子复制到CPU存储器中,同时删除它们。如果电脑包含多个CPU,则每个字符串可能会在备用CPU上继续运行。这意味着,每个字符串都可以将因子复制到不同CPU的CPU保留空间中。如下所示:

Java易失性示例

对于非易失性因素,没有关于Java虚拟机(JVM)何时将基本内存中的信息读入CPU存储器或者将信息从CPU保留区写入主存储器的认证。这可能会引起一些问题,我将在后面的部分中澄清这些问题。

设想这样一种情况:至少有两个字符串接近一个共同的文章,其中包含一个这样声明的反因素:

public class SharedObject {

  public int counter = 0;

}