“发布”一个对象的意思是指,使对象能够在当前作用域之外的代码中使用。当某个不应该发布的对象被发布时,这种情况就背称为“逸出”。发布对象的最简单的方法是将对象的引用保存到一个公有的静态变量中,以便任何类和线程都能看见该对象。例如:
public static <Secret> knownSecrets;
public void initialize(){
knownSecrets = new HashSet<Secret>();
}
当发布某个对象时,可能会间接地发布其他对象,在该对象的非私有域中引用的所有对象同样会被发布。
public class ThisEscape{
public ThisEscape(EventSource source){
new EventListener(){
public void onEvent(Event e){
doSomething(e);
}
}
}
}
在ThisEscape中给出的一个特殊示例,即this引用在构造函数中逸出。在构造过程中使this引用逸出的一个常见错误是,在构造函数中启动一个线程。当对象在其构造航书中创建一个线程时,,this引用都会被新创建的线程共享。在对象尚未完全构造之前,新的线程就可以看见他。在构造函数中创建线程没有错误,但最好不要立即启动它,而是通过一个start或者initialize方法来启动。
public class SafeListener {
private final EventListener listener;
private SafeListener(){
listener = new EventListener(){
public void onEvent(Event e){
doSomething(e);
}
};
}//end safeListener();
public static SafeListener newInstance(EventSource source){
SafeListener safe = new SafeListener();
source.registerListener(safe.listener);
return safe;
}//end newInstance()
}
分享到:
相关推荐
《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括可见性、发布与逸出、线程封闭、不可变性、安全发布等内容
3.2 发布与逸出 3.3 线程封闭 3.3.1 Ad-hoc线程封闭 3.3.2 栈封闭 3.3.3 ThreadLocal类 3.4 不变性 3.4.1 Final域 3.4.2 示例:使用Volatile类型来发布不可变对象 3.5 安全发布 3.5.1 不正确的发布:正确...
3.2 发布与逸出 3.3 线程封闭 3.3.1 Ad-hoc线程封闭 3.3.2 栈封闭 3.3.3 ThreadLocal类 3.4 不变性 3.4.1 Final域 3.4.2 示例:使用Volatile类型来发布不可变对象 3.5 安全发布 3.5.1 不正确的发布:正确...
15. 发布对象时,需要避免对象逸出,例如在构造函数中,开启线程,并将自身对象传入线程,造成引用传递。 16. 使用ThreadLocal变量可以确保线程封闭性,例如hibernate openSessionInView机制和jdbc的connection机制...
14. **对象发布的注意事项:** 发布对象时必须确保其完全构造完成,以防止对象逸出导致的线程安全问题。 15. **使用ThreadLocal确保线程封闭性:** 通过`ThreadLocal`可以在每个线程中存储独立的副本,从而避免线程...
5. **发布与逸出**: - **发布**:对象可以被外部代码使用。 - **逸出**:未准备好就发布的对象。避免构造函数中启动线程,可通过工厂方法或其他方法启动。 6. **线程封闭与不可变性**: - **线程封闭**:如...
此外,还涉及了对象共享,包括可见性、发布与逸出、线程封闭、不可变性以及安全发布。 第二部分“构造并发应用程序”则深入到任务执行、并发控制和错误处理等主题。如何在线程中执行任务,使用Executor框架,以及...
Java并发编程规则:不可变对象永远是线程安全的 在Java并发编程中,了解不可变对象的概念对于编写线程安全的代码至关重要。不可变对象是指创建后状态不能被修改的对象,这类对象天生就是线程安全的。它们的常量...
对象逸出->一种错误的发布.当一个对象还没有构造完成时.就使他被其他线程所见 安全的发布对象的4种方法 *在静态初始化函数中初始化一个对象的引用 *将对象的引用保存到volatile类型域或者AtomicReference对象中 *将...
以上是对 Java 基础面试题的一些解答,涵盖了 JDK 和 JRE 的区别、==与equals的区别、final的作用、字符串操作、抽象类和接口的区别、垃圾回收、异常处理、多线程以及并发控制等方面的知识点。在实际面试中,深入...
接下来的部分会深入讨论Thread类的API,包括设置线程名、守护线程、优先级、线程生命周期等方法,以及线程安全、对象发布与逸出、解决线程问题的方法,如原子性、可见性、线程封闭、不变性等。还会涉及synchronized...