1. volatile关键字
修饰的变量不会缓存在寄存器或者缓存在对其他处理器隐藏的地方。
因此某线程在读取volatile变量时总会读取到其他线程写入的新值。不代表多线程安全,如果其他线程正修改这个变量还没写入完成这个线程读取时仍然读取的是旧值。
2. 发布publishing \ 逸出escape
发布:一个对象被当前范围之外的代码使用。
逸出:一个对象尚未准备好就被发布出去。
内部类对象隐含包含了外部类对象的引用。 可以用 外部类.this 来获得外部类对象的引用。
当在主类的构造方法中创建一个线程并运行可能导致逸出,因为主类可能还没有构造完成不是稳定的,加上jvm的代码优化代码重排序,因此构造方法内不要运行线程。