this引用逃逸


import java.util.ArrayList;
import org.junit.Test;

public class LockTest {

    private Object privateField = "inited";

    public LockTest() {}

    public LockTest(ArrayList<Object> list) {
        list.add(new SubClass() {
            @Override
            Object getField() {
                return privateField;
            }
        });
    }

    public abstract class SubClass {
        abstract Object getField();
    }

    @Test
    public void test() {
        
        ArrayList arr = new ArrayList();
        
        // 当前线程在创建lockTest对象, privateField可能还未初始化
        LockTest lockTest = new LockTest(arr);
        
        // 并行线程如果在privateField初始化之前(也是在lockTest初始化之前),获取/操作 privateField,
        // 即可能出现竞态问题
        Object object = arr.get(0);
    }
}

发表评论

电子邮件地址不会被公开。

4 × = 4