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

标签 c# java c++ ruby

(我希望我可以为所有实现线程的类构造语言标记这个问题,但在 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/

相关文章:

c++ - OpenGL Sprite 半像素位置偏移

c# - 使用 MVC 在 Visual Studio 中创建一个新的 Controller 类?

c# - 要静态还是不要静态

java - 如何为java项目集成google分析来跟踪多个页面上的用户行为

java - spring-boot-starter-web 和 spring-boot-starter-webflux 不能一起工作吗?

c++ - 修改Prim的实现以记录最短路径的权重c++

c# - .designer 文件未与 Visual Studio 中的 .cs 文件关联?

C#:仅在 "full"参数之间有空格的参数化字符串?

java - 在java应用程序中执行curl命令

c++ - 使用字符数组和递归来反转字符串,一些线程1:EXC_BAD_ACCESS错误