课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
对象是程序员在学习软件编程开发技术的时候需要重点掌握的一个编程元素,下面我们就通过案例分析来了解一下,java编程对象发布与逸出需要注意哪些问题。
一、对象的发布和逸出
发布(publish)对象意味着其作用域之外的代码可以访问操作此对象。例如将对象的引用保存到其他代码可以访问的地方,或者在非私有的方法中返回对象的引用,或者将对象的引用传递给其他类的方法。
为了保证对象的线程安全性,很多时候我们要避免发布对象,但是有时候我们又需要使用同步来安全的发布某些对象。
逸出即为发布了本不该发布的对象。
使用静态变量引用对象是发布对象直观和简单的方式。
二、避免对象发布之线程封闭
线程封闭可以使数据的访问限制在单个线程之内,相对锁定同步来说,其实实现线程安全比较简单的方式。
java提供了ThreadLocal类来实现线程封闭,其可以使针对每个线程存有共享状态的独立副本。其通常用于防止对可变的单实例变量和全局变量进行共享,例如每个请求作为一个逻辑事务需要初始化自己的事务上下文,这个事务上下文应该使用ThreadLocal来实现线程封闭。
栈封闭是线程封闭的特例,即数据作为局部变量封闭在执行线程中,对于值类型的局部变量不存在逸出的问题,如果是引用类型的局部变量,开发人员需要确保其不要作为返回值或者其他的关联引用等而被逸出。
三、避免对象发布之不变性
某个对象创建之后就不能修改其状态,那么我们就说这个对象是不可变对象。
由于多线程操作可变状态会导致原子性、可见性一系列问题,所以线程安全性是不可变对象与生俱来的特性。
不可变对象由构造函数初始化状态,并可以安全的传递给任何不可信代码使用。
所有字段标记为final的对象,由于引用字段的对象可能可以直接修改,所以其并不一定是不可变对象,其需要满足以下条件
对象的所有字段都用final标记
对象创建之后任何状态都不能修改
对象不存在this隐式构造函数逸出
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼