Wikipedia上介绍了一种叫weighted reference counting的方法。大概思路是不一定要建一个引用就把引用计数加1,也可以是建一个引用就把引用计数加n,只要销毁引用的时候也减相同的n就能保证语义一致。这个n就是引用权重,引用计数其实是所有引用权重的总和。
具体做法是创建首个引用的时候,初始化引用权重为一个很大的值(例如:2^16)。从这个引用创建新引用的时候将这个权重分为两份,一半留给原引用,一半分给新引用。这个地方并不需要更新对象的引用计数。
如果当要分裂的引用权重为1时,重新向对象申请比较大的计数权重。
当引用销毁的时候引用计数减去对应的权重,当引用计数为0则说明对象已经没有引用了,可以安全的释放内存。
结论
这种整存零取的方式,优点是创建新引用的时候不需要更新引用计数,减少了线程同步的次数。当然销毁引用还是要同步的。
和朴素的引用计数一样,也是有循环引用的问题。