收录网站工具淘宝运营去哪里学
news/
2025/9/24 6:30:29/
文章来源:
收录网站工具,淘宝运营去哪里学,大学做视频网站,静安区建设工程招标投标管理部门网站java并发编程实战的解释#xff0c;不够详细#xff0c;尤其this引用逸出让人理解有些费解#xff0c;java并发编程实战里面的内容就直接拷贝过来发布#xff1a;使对象能够在当前作用域之外的代码中使用逸出#xff1a;当某个不该被发布的对象被发布时#xff0c;这种情…java并发编程实战的解释不够详细尤其this引用逸出让人理解有些费解java并发编程实战里面的内容就直接拷贝过来发布使对象能够在当前作用域之外的代码中使用逸出当某个不该被发布的对象被发布时这种情况称为逸出发布内部状态将会破坏封装性并使得程序难以维持不变性条件当某个对象逸出后必须对程序进行分析以便找出哪些对象或线程可能会误用该对象这正是使用封装的最主要原因使对程序的正确性分析变为可能并使无意中破坏设计约束条件变得更难无论其它的线程会对逸出的对象引用执行何种操作都不重要因为误用该引用的风险始终是客观存在的发布的实现方式1.对象引用作为非私有属性代码示例//只是代码示例不推荐这样初始化Listpublic class test {public List animals new ArrayList(){{add(new Animal());}};}List对象和List中的Animal对象都被发布出去。2.对象引用被非私有方法返回代码示例//只是代码示例不推荐这样初始化Listpublic class test {private List animals new ArrayList(){{add(new Animal());}};public List getAnimals(){return animals;}}1、2的一样List对象和List中的Animal对象发布出去。只是一个是方法发布出去一个是属性发布出去。3.外部方法发布对象外部方法定义对当前类来说外部方法是指行为不完全由当前类来规定的方法包括其他类中定义的方法以及当前类中可以被改写的方法(既不是私有方法也不是final方法)代码示例public class test {public void setAnimals(Animal animal){animal.setDag(new Dog(){public void doSomething(){...};})}}当前类test来说setDag为外部方法Dog就被发布了。this引用逸出基于外部方法发布对象引出this引用逸出问题。直接拿java并发编程实战的代码public class ThisEscape {public ThisEscape(EventSource source){source.registerListener(new EventListener(){public void onEvent(Event e){doSomething(e)}});}}java并发编程实战的解释当ThisEscape发布EventListener时它也无条件地发布了封装(enclosing)ThisEscape的实例因为内引类(inner class inst ances)的实例包含了对封装实例隐含的引用。这里发布new EventListener()内部对象隐式的有个this。也就是ThisEscape也会被发布出去但是ThisEscape还没有构建完成存在逸出的可能ThisEscape在未构建完成被发布了。怎么处理这个可能逸出的问题就是让ThisEscape构建完成再发布出去就可以了。java并发编程实战的提到私有构造函数公共的工厂方法解决可能逸出的问题。public class ThisEscape {private final EventListener listener;private ThisEscape(){listener new EventListener(){public void onEvent(Event e){doSomething(e)}};}public static ThisEscape newInstance(EventSource source){ThisEscape thisEscape new ThisEscape();source.registerListener(thisEscape.listener);return thisEscape;}}同理在构造函数可以新建线程当不要start()。start()的话this被新线程共享。下面代码就是错误的public class ThisEscape {private Thread thread;public ThisEscape(){thread new Thread(){public void run(){...}};thread.start(); //可以在构造函数中new Thread 但是不要start}public static void main(String[] args){ThisEscape a new ThisEscape();}}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/915081.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!