About reference to object before object's constructor is finished

后端 未结 4 579
感情败类
感情败类 2020-12-13 21:38

Every one of you know about this feature of JMM, that sometimes reference to object could receive value before constructor of this object is finish

4条回答
  •  轮回少年
    2020-12-13 22:02

    In the full example

    class FinalFieldExample { 
        final int x;
        int y; 
        static FinalFieldExample f;
    
        public FinalFieldExample() {
            x = 3; 
            y = 4; 
        } 
    
        static void writer() {
            f = new FinalFieldExample();
        } 
    
        static void reader() {
            if (f != null) {
                int i = f.x;  // guaranteed to see 3  
                int j = f.y;  // could see 0
            } 
        } 
    }
    

    As you can see, f is not set until after the constructor returns. This means f.x is safe because it is final AND the constructor has returned.

    In the following example, neither value is guarenteed to be set.

    class FinalFieldExample { 
        final int x;
        int y; 
        static FinalFieldExample f;
    
        public FinalFieldExample() {
            x = 3; 
            y = 4; 
            f = this; // assign before finished.
        } 
    
        static void writer() {
            new FinalFieldExample();
        } 
    
        static void reader() {
            if (f != null) {
                int i = f.x;  // not guaranteed to see 3  
                int j = f.y;  // could see 0
            } 
        } 
    }
    

    According to statement (1) we should avoid sharing reference to immutable object before its constructor is finished

    You should not allow a reference to an object escape before it is constructed for a number of reason (immutable or other wise) e.g. the object might throw an Exception after you have store the object.

    According to JLS's given example (2) and conclusion (3) it seems, that we can safely share reference to immutable object, i.e. when all its fields are final.

    You can safely share a reference to an immutable object between threads after the object has been constructed.

    Note: you can see the value of an immutable field before it is set in a method called by a constructor.

提交回复
热议问题