使用 引用计数 来跟踪访问共享对象的对象数量
2017-03-01 16:09
344 查看
来自于 think in java
output:
creating Shared 0
creating composing 0
creating composing 1
creating composing 2
creating composing 3
creating composing 4
disposing composing 0
disposing composing 1
disposing composing 2
disposing composing 3
disposing composing 4
Disposing Shared 0
creating Shared 1
creating composing 5
Error: object os not proper clean-up!
可以看出使最后一个composing对象存活,报错!
import static org.print.Print.*; class Shared{ private int refcount=0; private static long counter=0; // 跟踪实例对象 private final long id=counter++; //id定义为final,不希望它的值在对象的生命周期内被改变 public Shared(){ print("creating "+this); } public void addRef(){ refcount++; } //当有一个对象附到类上时,调用addRef() protected void dispose(){ if(--refcount==0) print("Disposing "+ this); } protected void finalize(){ if(refcount != 0 ){ print("Error: object os not proper clean-up!");} //校验终止条件,当有对象引用,不允许清理; } public String toString(){ return "Shared "+id; } } class Composing{ private Shared shared; private static long counter=0; private final long id=counter++; public Composing(Shared shared){ print("creating "+this); this.shared=shared; this.shared.addRef(); } protected void dispose(){ print("disposing "+ this); shared.dispose(); } public String toString(){ return "composing "+id;} } public class ReferCounting { public static void main(String[] args){ Shared shared=new Shared(); Composing[] composing={ new Composing(shared), new Composing(shared), new Composing(shared), new Composing(shared), new Composing(shared) }; for(Composing c:composing) c.dispose(); System.gc(); new Composing(new Shared()); System.gc(); } }
output:
creating Shared 0
creating composing 0
creating composing 1
creating composing 2
creating composing 3
creating composing 4
disposing composing 0
disposing composing 1
disposing composing 2
disposing composing 3
disposing composing 4
Disposing Shared 0
creating Shared 1
creating composing 5
Error: object os not proper clean-up!
可以看出使最后一个composing对象存活,报错!
相关文章推荐
- 类对象引用计数使用模板实现(奇特的递归模板模式)
- QPointer,QSharedPointer,QWeakPointer的区别与使用例子(QSharedPointer类似Delphi里的引用计数,是强引用,而QWeakPointer是弱引用,不影响原始对象的引用计数,相当于是在暗中观察对象,但保持联系,需要的时候就会出现)
- python基础===文件对象的访问模式,以及计数循环的使用方法
- Java虚拟机值对象访问以及如何使用对象的引用(2)
- C++的引用计数j控制智能指针——>Java的引用计数管理共享对象
- 手动释放(dispose)对象空间和跟踪引用计数
- java中跟踪共享对象的调用数量
- 使用临界区CRITICAL_SECTION结构对象保护多线程互斥地访问共享资源
- 关于使用ASP.NE 1.1发送电子邮件时出现的 未能访问“CDO.Message”对象 的错误的解决方法
- Flyweight 使用共享来有效地支持大量的细粒度对象
- 如何使用动态共享对象的模式来安装PHP
- 使用一些需要共享对象的一点小经验
- 使用ADF bindings访问一个嵌套的对象
- 如何实现引用计数对象
- javascript使用方括号([])引用对象的属性和方法
- 访问使用自定义弹出对象的网页时,Internet Explorer 6 意外关闭
- 使用 .NET 远程处理访问其他应用程序域中的对象
- 在 Linux 中使用共享对象
- 对象引用计数
- ATL学习笔记(1):ATL单线程与多线程套间对象引用计数的基础实现