Java:这个Singleton类变量赋值线程是否安全?

时间:2014-11-04 17:43:55

标签: java multithreading singleton

公共类A {}

// 1.假设Test绝对是一个单例,这里跳过singleton default impl

// 2.测试字段a(A类)没有脏值问题,或者是吗?

// 3. Singleton Object(例如,此示例)字段赋值(在多线程环境中),没有竞争条件或死锁问题,或者它是否存在?

public class Test
{

    private A a;

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

1 个答案:

答案 0 :(得分:4)

您的代码不是线程安全的。

假设

  1. 线程1名为Test.get()
  2. 检查线程1 get()方法(a == null) - >这是真的
  3. ---上下文切换---
  4. 线程2名为test.get()
  5. 检查线程2 get()方法(a == null) - >这是真的
  6. 线程2 get()方法创建一个A1对象并将其分配给;
  7. 线程2 get()方法返回A1
  8. ---上下文切换---
  9. 线程1 get()方法创建一个A2对象并将其分配给;
  10. 线程1 get()方法返回A2
  11. 这意味着两个不同的线程得到了两个不同的A类实例

    希望这有帮助