Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Clojure中的析构函数模拟 问题陈述_Java_Clojure - Fatal编程技术网

Java Clojure中的析构函数模拟 问题陈述

Java Clojure中的析构函数模拟 问题陈述,java,clojure,Java,Clojure,我有两台机器,A和B,都运行Clojure B有一些内存中的数据结构 A保存一个对象A_p,它是指向B内存中某个对象B_O的引用/指针 现在,只要A_p不是由A进行GC编辑,我就不希望B_O被B进行GC编辑 然而,一旦A_p已经被A GC-ed(A中没有其他任何东西指B_O,B中没有其他任何东西指B_O),那么我希望B_O可以被GC-ed 使用析构函数的语言解决方案 在C++中,这很简单——我使用析构函数。当A_P获取GC ed时,A发送B A msg以减少对B_O的外部引用的数量,当该数量为0

我有两台机器,A和B,都运行Clojure

B有一些内存中的数据结构

A保存一个对象A_p,它是指向B内存中某个对象B_O的引用/指针

现在,只要A_p不是由A进行GC编辑,我就不希望B_O被B进行GC编辑

然而,一旦A_p已经被A GC-ed(A中没有其他任何东西指B_O,B中没有其他任何东西指B_O),那么我希望B_O可以被GC-ed

使用析构函数的语言解决方案 在C++中,这很简单——我使用析构函数。当A_P获取GC ed时,A发送B A msg以减少对B_O的外部引用的数量,当该数量为0时,对B_0的内部引用也为0,则B_O获取GC-ed

Java/Clojure中的解决方案? 现在,我知道Java没有析构函数。然而,我想知道Clojure是否有办法解决这个问题


谢谢

不,Clojure(基于JVM,CLR)没有“C++类型析构函数”,因为JVM的自动内存管理模型。有些东西像终结器,但建议不要使用它们。相反,您应该基于消息传递机制对您的解决方案进行建模,而不是一台持有B中数据的“指针/引用”的机器。我知道这个答案非常高,因为您在问题中没有提供任何具体的问题细节。如果您需要有关如何解决特定问题的更多详细信息,请提供完整的上下文,我相信有人能够帮助您。

没有真正的分布式垃圾收集器,就不存在好的解决方案。即使在C++中,也不能安全地执行此操作,因为您实现了引用计数,并假装它是真正的垃圾收集器;但是,如果两个对象在机器分界中相互指向,并且都在本地未被引用,那么它们仍然具有非零引用计数并且无法被收集。

这是一个固有的难题:分布式垃圾问题即使不是不可能,也是非常困难的

但是,您可能只需要使用Java Finalizers并重写
finalize()
方法就可以使其正常工作。然后,您可以实现类似于您为C++所描述的消息传递技术。
这在更一般的情况下会有问题(正如amalloy指出的那样,它不会帮助您在机器之间进行循环引用),并且还有一些其他需要注意的问题(主要是您无法控制最终用户的确切呼叫时间)但是,您可能能够使它在您的特定情况下工作。

假设您使用ref或atom之类的数据结构在其中的某个位置保存数据结构a,您可以使用侦听器监视该结构的状态以删除,这些侦听器可以向B发送适当的消息。
clojure.data/diff
对于查找已删除的结构非常有用


另一个选项是,在A结构被取消引用后,负责此操作的函数立即发送消息。但是,作为这项工作的一部分,请确保该代码实际上负责删除,而不是其他更新。

您可能需要搜索有关分布式垃圾收集的信息。不过,祝你好运,因为网络可靠性问题本身就存在问题。