gpt4 book ai didi

c# - 为什么类结构语言中的构造函数通常被认为是线程安全的?

转载 作者:数据小太阳 更新时间:2023-10-29 08:18:30 24 4
gpt4 key购买 nike

(我希望我可以为所有实现线程的类构造语言标记这个问题,但在 Java、C++、C# 和 Ruby 下。并不是说我对所有这些都很酷)

我想我已经在博客文章/教程中看到过这种效果的陈述(类构造函数是线程安全的)。我无法追踪任何直接的陈述,但许多帖子和教程都做出了假设,或者甚至没有提到线程在构造函数和析构函数上运行的问题。坚持使用具有多线程历史和一些正式方法的 Java,

Javamex

Jankov's tutorials

Oracle tutorials

所有这些文章/网页都以自信的方式撰写并包含全面的讨论。他们都提到了方法同步的 Java 特性,所以你希望他们能提到这将如何影响构造和销毁的特殊方法。但他们没有。

但是类构造函数和析构函数需要像任何类方法一样来考虑。这是一篇关于 Java 的文章,

Safe construction techniques in Java

关于从构造函数中泄漏“this”引用。这里有一些 StackOverflow 帖子,

Incompletely constructed objects in Java ,

Java constructor needs locking

显示有线程问题的构造函数。我怀疑特殊方法中的线程问题仅限于 Java。

所以,我想知道,

  • 线程安全假设(无论如何定义)是否基于构造函数的一般布局?没有太多代码的紧密编码的构造函数将接近可重入代码(通过参数接受数据等)

  • 或者解释器/编译器是否以特殊处理或保护来处理构造函数/析构函数?比如Java内存模型在构建结束时对期望做了一些注释,我希望其他语言规范也会这样。

Wikipedia on constructors对此几乎没有。在不同的上下文中这篇文章 Constructors in Programming languages包含一些提示,但与线程安全无关。

虽然专业书籍中有很多信息,但最好在 StackOverflow 上进行一般性(尽管特定语言的提及很有趣!)解释/讨论。

最佳答案

一般来说,不指向共享数据的局部变量是线程安全的。由于您通常只在一个线程中创建一个对象,因此它实际上是一个线程本地数据结构,因此线程安全(大部分)。

在 Java 中,您可以通过多种方式打破这个假设,包括

  • 在构造函数中启动一个新线程
  • 设置对另一个线程可见的对象的引用。
  • 使用非最终字段并将对象添加到线程不安全容器或共享数据结构。

通常这些行为都被认为是不好的做法,所以如果你避免这些,你就有了一个线程安全的构造函数而不需要锁定。

关于c# - 为什么类结构语言中的构造函数通常被认为是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20868515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com