当前位置: 首页 > 知识库问答 >
问题:

并发对象销毁

翁鸿远
2023-03-14

如果一个具有静态存储持续时间的对象的构造函数的完成或动态初始化在另一个对象的完成之前被排序,则第二个对象的析构函数的完成将在第一个对象的析构函数的启动之前被排序。[注:此定义允许并发销毁。-结束注]

第二个和第一个的完成析构函数可能在不同的线程中吗?

共有1个答案

农存
2023-03-14

注意:我编辑并更正了关于unsequenced初始化的语句(感谢@dyp)。如果您的程序没有启动任何线程,那么所有的初始化都是以某种(可能不确定的)顺序进行的。

除了标准1中描述的约束之外,没有其他约束,线程在标准1上对静态存储持续时间的对象执行初始化和销毁。特别地,不同转换单元中对象的初始化彼此不确定地排序(参见[basic.start.init]/2),如果程序启动线程,则不排序。

因此,如果TU中的第一个函数调用发生在主线程以外的另一个线程中,那么初始化可能会在多个线程中同时发生。标准所说的是,那些初始化被排序的对象(例如,在同一个TU中的对象)也会以确定的、兼容的顺序被销毁。

 类似资料:
  • 高级并发对象 目前为止,之前的教程都是重点讲述了最初作为 Java 平台一部分的低级别 API。这些API 对于非常基本的任务来说已经足够,但是对于更高级的任务就需要更高级的 API。特别是针对充分利用了当今多处理器和多核系统的大规模并发应用程序。 本章,我们将着眼于 Java 5.0 新增的一些高级并发特征。大多数功能已经在新的java.util.concurrent 包中实现。Java 集合框

  • 问题内容: 我有: 在内部,我有一个我不想传递给克隆元素的属性。 我能怎么做? 问题答案: 您可以使用对象rest / spread语法: 我假设您已经基于上面的代码获得了此语法的支持,但是请注意,这是一个建议的语法,可通过babel stage 1预设 提供给您。如果在执行时遇到语法错误,则可以如下安装预设: 然后将其添加到babel配置的“预设”部分。例如,在您的.babelrc文件中: 根据

  • 对象使用完之后需要对其进行清除。对象的清除是指释放对象占用的内存。在创建对象时,用户必须使用 new 操作符为对象分配内存。不过, 在清除对象时,由系统自动进行内存回收,不需要用户额外处理。这也是 Java 语言的一大特色,某种程度上方便了程序员对内存的管理。 Java 语言的内存自动回收称为 垃圾回收(Garbage Collection)机制,简称 GC。垃圾回收机制是指 JVM 用于释放那些

  • void unregister_object(string object_name) Use this to unregister an object. 注销一个对象。

  • 问题内容: 我对垃圾收集器在Java中的工作方式有一个大致的了解,但是我销毁对象的原因不是因为我关心释放内存,而是因为功能。我可以用一个例子更好地解释: 假设我正在制作涉及金钱的游戏。当某人从地面上捡起一个物体时,我想调用该物体的方法,该方法涉及为该人的钱包添加一个值。 之后发现,我不希望别人能够把它捡起来。换句话说,我不希望自己或任何其他程序能够不经意间拨打电话: 因此,在Bob拿起钱后,它的价

  • 问题内容: 我在接受以下采访时遇到了这个问题: 如何在Java中销毁对象? 答案应该是e? 如果e不在那里怎么办?然后 ?显然,c不是答案。a和b将为整个应用程序执行gc(问题需要一个对象)。我认为这是d,因为finalize()刚好在gc之前被调用(但是是否有必要在finalize gc之后被调用?)还是我错了?您必须在那里回答这个问题吗? 问题答案: 答案E是正确答案。如果E不存在,您将很快用