【问题标题】:In java, what happens when deleting an object while it is being used?在java中,删除一个正在使用的对象会发生什么?
【发布时间】:2015-09-06 02:50:17
【问题描述】:

这是场景:

  1. 我有一个 java Hashtable,它以字符串为键,以对象为值。

  2. 一个线程通过key获取对象并调用该对象的方法。

  3. 当该方法执行步骤 b) 中的某些操作时,另一个线程在引用该对象的特定键上调用 remove。

然后会发生什么?

我应该锁定操作本身吗?

【问题讨论】:

  • 请注意,在 Java 中无法“删除”对象;只有垃圾收集器可以做到这一点。如果对对象的所有引用超出范围,则 GC 可以在它认为合适的时候恢复已使用的内存。

标签: java multithreading object hashtable


【解决方案1】:

逻辑将完成,对象将从表中删除,尽管表的状态可能不准确,具体取决于您的线程何时从表中读取。

【讨论】:

  • 是的,我正在使用 Hashtable 类。所以换句话说,来自那个线程的操作将在对象被删除之前完成?
  • 对象被移除没关系,对象是通过引用获取的,逻辑将在该对象上完成。
  • 谢谢,明白了。。基本上线程调用hashtable的get方法获取对象的时候,是通过引用获取的,调用hashtable的remove时,只会删除哈希表角度的引用与从线程获取的引用无关。我理解正确吗?
  • @user2001996 是的,你是。很高兴我们能提供帮助!
【解决方案2】:

假设您正在谈论(线程安全的)java.util.Hashtable,什么都不会发生。从Hashtable 中删除对象不会影响对该对象的其他 引用。

对象只有在 nothing 引用它们时才有资格进行垃圾回收。

【讨论】:

  • 是的,我正在使用 Hashtable 类。所以换句话说,来自那个线程的操作将在对象被删除之前完成?
  • 不正确。该对象将从散列表中删除,完全独立于在该对象上调用的方法
  • 明白了,谢谢...所以哈希表中的引用被删除,但线程中的引用仍然继续并完成操作。那时,该对象将有资格进行 GC,因为它不再被引用....
  • @user2001996 remove 先发生(所以get 返回null)或get 先发生(所以不会)。
  • @immibis 在问题中描述的场景中,似乎remove() 调用严格发生在get() 之后。
【解决方案3】:

方法本身引用了对象。如果你能看到一个对象,你就会通过引用看到它。

【讨论】:

    【解决方案4】:

    您不能在 Java 中删除对象。您没有用完内存的原因是垃圾收集器会在您不查看时为您删除它们 - 这意味着如果有任何方法可以告诉您对象已被删除,它不会被删除。 (除了为此目的设计的东西,比如finalizeWeakReference)。

    从 Hashtable 中移除一个对象只会影响 Hashtable;它对实际对象没有任何影响,尤其是它不会删除对象。

    【讨论】:

      【解决方案5】:

      实际发生的情况不仅仅取决于您指定的内容。特别是,除非第 2 步与第 3 步有 happens-before 关系,否则完全有可能在第 2 步开始之前从您的地图中删除该值。

      假设步骤 3 中的数据结构是线程安全的(Hashtable 是),那么步骤 3 将没有问题;它将成功删除该条目。但是,如果没有显式锁定,步骤 2 可能会遇到问题。例如,如果您在调用get() 之前调用containsKey(),并且步骤3 恰好在这两个调用之间运行,则步骤2 的行为将不一致。这称为race condition

      有许多方法可以确保发生之前的关系(其中一种确实是锁定),但您需要什么取决于您的要求。

      顺便说一句,使用Hashtable 没有什么好处;这是一个旧的、缓慢的 Map 实现,与标准替代方案相比没有特别的优势。

      如果您的映射数据将仅由一个线程访问(或者您将使用自定义锁定强制同步访问),请使用 HashMap。如果您的映射数据将在线程之间共享,请使用ConcurrentHashMap

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-27
        • 1970-01-01
        • 2011-08-06
        • 1970-01-01
        • 2017-07-16
        • 2011-03-26
        相关资源
        最近更新 更多