Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:这个单例类变量赋值是线程安全的吗?_Java_Multithreading_Singleton - Fatal编程技术网

Java:这个单例类变量赋值是线程安全的吗?

Java:这个单例类变量赋值是线程安全的吗?,java,multithreading,singleton,Java,Multithreading,Singleton,公共A类{} //一,。假设测试肯定是一个单例测试,这里跳过单例默认impl //二,。测试字段a(a类)没有脏值问题,或者是否有 public class Test { private A a; public A get() { if (a == null) { a = new A(); } return a; } } //三,。Singleton对象(例如,本示例)字段分配(在多线程环境中)

公共A类{}

//一,。假设测试肯定是一个单例测试,这里跳过单例默认impl

//二,。测试字段a(a类)没有脏值问题,或者是否有

public class Test
{

    private A a;

    public A get() {
        if (a == null) {
            a = new A();
        }
        return a;
    }
}
//三,。Singleton对象(例如,本示例)字段分配(在多线程环境中)没有争用条件或死锁问题,或者是否存在

public class Test
{

    private A a;

    public A get() {
        if (a == null) {
            a = new A();
        }
        return a;
    }
}

您的代码不是线程安全的

假设

  • 线程1调用了Test.get()
  • 检查线程1 get()方法(a==null)->这是真的
  • ---这里是上下文切换---
  • 线程2调用了test.get()
  • 线程2 get()方法已检查(a==null)->哪个为true
  • 线程2 get()方法创建一个A1对象并将其分配给
  • 线程2 get()方法返回A1
  • ---这里是上下文切换---
  • 线程1 get()方法创建一个A2对象并将其分配给
  • 线程1 get()方法返回A2
  • 这意味着两个不同的线程获得了两个不同的类A实例


    希望这有帮助

    您的代码不是线程安全的

    假设

  • 线程1调用了Test.get()
  • 检查线程1 get()方法(a==null)->这是真的
  • ---这里是上下文切换---
  • 线程2调用了test.get()
  • 线程2 get()方法已检查(a==null)->哪个为true
  • 线程2 get()方法创建一个A1对象并将其分配给
  • 线程2 get()方法返回A1
  • ---这里是上下文切换---
  • 线程1 get()方法创建一个A2对象并将其分配给
  • 线程1 get()方法返回A2
  • 这意味着两个不同的线程获得了两个不同的类A实例


    希望这有帮助

    没有死锁,但它绝对不是线程安全的。您可以很容易地创建多个实例。没有死锁,但绝对不是线程安全的。您可以很容易地创建多个实例。