对象分配线程安全吗?

Bre*_*ret 5 c# multithreading thread-safety

这个线程安全吗?具体来说,该GetMyObject()方法是否可以返回null?我知道两个线程有​​可能获得不同的实例,MyObject但我并不关心.我只是想确保假设GetMyObject()永远不会返回null 是安全的.

   class Foo {
        private static MyObject obj;
        public static MyObject GetMyObject() {
            MyObject o = obj;
            if(o == null) {
                o = new MyObject();
                obj = o;
            }
            return o;
        }
        public static void ClearMyObject() {
            obj = null;
        }
    }

    class MyObject {}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 6

这个线程安全吗?

没有.

GetMyObject()方法是否可以返回null?

没有.

保证该方法永远不会返回null.并且所有的读写都保证是原子的.但是,不保证线程读取最新版本的静态字段obj,并且不保证线程具有对obj的更改序列的一致视图.任意多个线程可能会竞争并观察不同的obj值.我不认为这个代码"线程安全",但也许你有一个不同的"线程安全"定义.这是问这个问题的问题; 每个人都可以认可的术语没有标准定义.


Lau*_*all 5

GetMyObject()永远不会返回null.看到这个的简单方法是注意'o'是一个局部变量,所以没有其他人可以影响它.