问题标签 [weak-references]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1026 浏览

python - Python:带有短命键的线程安全字典,这是正确的吗?

假设 do_thing() 在许多 id 编号可能相同也可能不同的线程上被多次调用(例如,4 次 ID 为 3,各有一次 ID 不同),这个线程安全吗?one_time_init() 是否会一次针对特定的作业 ID 运行多次?(PS:one_time_init 保存每个 ID 运行一次的状态,因此如果它已经运行完成,则调用它是无操作的)


更新代码(感谢 THC4k):

0 投票
4 回答
21716 浏览

java - 了解 Java 的引用类:SoftReference、WeakReference 和 PhantomReference

有人可以解释三个参考类之间的区别(或发布一个很好的解释的链接)吗?SoftReference> WeakReference> PhantomReference,但我什么时候会使用每一个?为什么有一个WeakHashMap但没有SoftHashMapPhantomHashMap

如果我使用以下代码...

...怎么了?我是否必须ref在每条语句之前检查是否为空(这是错误的,但我该怎么)?很抱歉这些快速的问题,但我无法理解这些Reference课程......谢谢!

0 投票
1 回答
324 浏览

silverlight - Silverlight WP7 消息传递,我应该使用 Wea​​kReference 吗?如果可以,如何使用?

我正在为 Windows phone silverlight 应用程序创建一个简单的消息传递系统。

这个想法是各种 xaml 页面和其他对象将订阅一个消息传递对象,传递他们想要接收/处理的消息类型和一个 Action<> Delegate 作为处理程序。

当一个动作发生时,一条消息(带有有效负载)将被发送给正确的订阅者。

这是我想要的消息类的快速草稿。

因此,各种订阅者将为自己添加一个类型,Action。据我了解,这将阻止原始页面/对象被垃圾收集(我认为它会是其他情况?)因为对它的引用将始终存在。

我无法真正取消订阅,或者并非总是如此,并且消息队列将在应用程序的整个生命周期内一直存在。

我应该实施 WeakReferences 吗?如果是,如何实施?

WeakReferences 会增加更多开销吗?

考虑到这一点,我是否疯了,因为正在使用的内存很小?

0 投票
6 回答
624 浏览

c# - 为什么 WeakReference 在析构函数中没有用?

考虑以下代码:

使用以下输出:

为什么它是假的和空的?A 还没有被收集到。

编辑:哦,你的小信仰。

我添加了以下几行:

查看更新的输出。

0 投票
5 回答
10146 浏览

iphone - 如何在 Objective-C 中创建弱引用?

我有这样的情况:

现在这是一个保留周期,我怎样才能打破这个保留周期?(使用弱引用)....在上面的例子中。谢谢

0 投票
3 回答
16112 浏览

c# - 事件如何导致 C# 中的内存泄漏以及弱引用如何帮助缓解这种情况?

有两种方法(我知道)在 C# 中导致无意的内存泄漏:

  1. 不处置实施的资源IDisposable
  2. 不正确地引用和取消引用事件。

我真的不明白第二点。如果源对象的生命周期比侦听器长,并且在没有其他对它的引用时侦听器不再需要事件,则使用正常的 .NET 事件会导致内存泄漏:源对象将侦听器对象保存在内存中应该被垃圾收集。

你能解释一下事件如何用 C# 中的代码导致内存泄漏,以及我如何使用弱引用和不使用弱引用来编写代码来解决它?

0 投票
1 回答
7047 浏览

android - 对活动的弱引用(Android)

在我的 Android 应用程序中,当用户尝试从一个活动转换到另一个活动时,可能会有一些全局状态表明他们需要先完成一些其他操作。

为此,我使用以下代码编写了一个类:

当阻塞活动完成时,它调用 ThisClass.blockingActivityFinished()。这将检查对旧活动的弱引用是否仍然存在,如果存在,则从该活动启动原始意图。如果没有,它将从我的应用程序的上下文中启动原始意图。

我的问题是,
这听起来合理吗?这种技术是否存在任何潜在的内存泄漏问题?有没有更好的方法来实现这一点?

编辑 - 需要明确的是,可能触发中断的事件类型是 1) 指示当前应用程序版本已弃用的服务器 ping 2) 指示用户凭据不再有效的任何服务器 RPC。我不想为每个 Activity 添加逻辑来处理这些检查,并在它们完成后照常恢复业务。这违反了 DRY,并且在团队环境中容易出错。

0 投票
3 回答
930 浏览

java - 如果存在强引用,线程安全对象池保证返回现有对象?

我正在尝试扩展 Clojure 语言以将 ACI 保证的 refs 扩展为 ACID 保证的 drefs(持久参考)。API 是简单的调用(dref key value),其中key是要在底层数据存储中使用的键的字符串(在我当前的实现中是 BDB JE),并且value是应该初始化 dref 的对象。如果key数据库中已经存在,则使用存储的值。

可以使用相同的密钥创建多个 dref,并且它们需要同步,即,如果具有密钥“A”的一个 dref 参与了使用 写入或读取它的事务,则(ensure)具有密钥“A”的所有其他 dref 必须是事务性的同步:必须使用读锁和写锁来对涉及这些 dref 的事务进行排序。从更大的意义上说,尽管内存中可能有多个具有相同键的 dref,但所有具有该键的 dref 都是一个逻辑对象。

出于显而易见的原因,简单地确保这个单个逻辑 dref 是使用单个具体的内存中 dref 实现的要容易得多。这样就没有什么要同步的了。我该怎么做呢?

显而易见的答案是使用 key 上的对象。如果池存在, Clojure 将调用静态getInstance(key,value)方法从池中检索,如果不存在,则创建它并填充池。这种方法的问题是没有简单的方法让 Clojure 在完成时释放对象。内存泄漏城市。我必须确保不会收集任何对其有强引用的对象,并且它们存在于池中。如果池丢失对仍在使用的逻辑 dref 的引用,那将是灾难性的,因为另一个进程可以使用相同的密钥创建一个新的 dref,并且对于具有相同密钥的另一个 dref,它在事务上是不安全的。

所以我需要WeakHashMap使用非强引用的一些版本或一些东西(我更喜欢SoftReferences 让 GC 更不情愿)。所以:

  1. 如果我使用 a HashMap<String,SoftReference<DRef>>,如果收集到条目(SoftReference)的值,如何确保映射将逐出条目?某种守护线程?
  2. 如何使 GC 的池线程安全?还是我不必担心,因为 GC 在SoftReference级别上运行,而我的守护线程将是在Map级别上运行的那个?
  3. 在相关说明中,如何确保守护线程正在运行?有没有什么方法可以停止而不抛出异常,如果没有被捕获,整个 JVM 会崩溃?如果是这样,我如何监控并在需要时启动一个新的?
0 投票
1 回答
1653 浏览

weak-references - vala中“弱”和“无主”引用之间的区别?

Vala 中的弱引用和无主引用有什么区别。

根据我从 Vala 教程中学到的知识,不计算弱引用和无主引用,当真实实例超出范围时,它们将引用 null(!!)。

为什么出于一个原因应该有两种不同的方法?(如果他们做同样的工作)如果没有,有人可以给我一个简单的例子来说明我们为什么以及何时必须使用它们中的每一个?!

非常感谢

0 投票
3 回答
412 浏览

java - GC 会收集 SoftReference 和 WeakReference 引用的对象吗?

我有一个从 Map 到 SoftReferences 的缓存。当它们被添加时,它们会被放入另一个队列中,以便通过 gzip 或类似的方式延迟压缩。我的想法是:我希望对压缩队列中的对象进行弱引用,这样当压缩任务到达对象时,如果它已经消失,我们就不必费心压缩它——而且压缩队列也没有t 保持对象处于活动状态,否则会被 GC 处理。

那么如果恰好有一个 SoftReference 和一个 WeakReference,那么 SoftReference 的语义是否仍然适用?