Java多线程,对象的发布与逸出
一、概念
在多线程中,对象的“发布(publish)”是指,使对象能够在当前作用域之外访问。如:将指向该对象的引用保存到其他代码可以访问的位置,在非私有方法中返回某个 对象的引用等。对象被发布后,意味着多个线程可以并发访问对象,就必须通过同步等机制控制对象的访问,以免造成线程安全性问题。对象的“逸出(escape)”是指,对象在不应该被发布的情况下被发布,对象要根据需要进行发布,但同时要避免对象因疏忽或代码错误意外的逸出。
二、发布的方式
1. 将对象的引用存到共有的静态变量中
2. 对象被间接的发布:如,对象保存在集合类中,而这个集合类被发布出去,那么,所有可以遍历此集合的地方都嫩访问集合中的对象。
3. 从非私有方法返回一个对象引用
4. 非私有属性会被发布
5. 将对象当作参数传递给外部方法。外部方法包括,其他类中的方法或者类中可以被改写的方法(既不是private也不是final修饰的方法,因为此方法可能被重写),无法保证传递给外部方法的对象如何被使用,有“逸出”的风险
6. 发布一个内部类的实例。因为内部类实例中包含了对外部类实例的引用
参考:
《Java并发编程实战》 - 第三章 3.2 节 发布与溢出
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于