(我希望我可以为实现线程的所有类构造语言标记这个问题,但是这里有Java,C++,C#和Ruby.不是我对所有这些都很酷)
我想我已经在博客文章/教程上看到过这种效果的陈述(类构造函数是线程安全的).我无法追踪任何直接的陈述,但许多帖子和教程都做出了假设,或者甚至没有提到在构造函数和析构函数上运行的线程问题.坚持Java,它有一个历史和一些正式的多线程方法,
Javamex
扬科夫的教程
Oracle教程
所有这些文章/网页都以自信的方式编写,并包含全面的讨论.他们都提到了方法同步的Java特性,所以你希望他们可能会提到这会如何影响构造和破坏的特殊方法.但他们没有.
但类构造函数和析构函数需要像任何类方法一样考虑.这是一篇关于Java的文章,
Java中的安全构造技术
关于从构造函数泄漏'this'引用.这里有几个StackOverflow帖子,
Java中不完整构造的对象,
Java构造函数需要锁定
显示具有线程问题的构造函数.我怀疑特殊方法中的线程问题仅限于Java.
所以,我想知道,
是否基于构造函数的总体布局假设了线程安全(无论如何定义)?一个代码不多的紧密编码的构造函数将接近可重入代码(通过参数接受数据等)
或者口译员/编制者是否处理具有特殊待遇或保护的施工人员/破坏者?例如,Java内存模型在构造结束时对期望做出一些评论,我希望其他语言规范也是如此.
维基百科关于构造函数的内容很少.在不同的上下文中,这篇文章中的构造语言中的构造函数包含一些提示,但不是关于线程安全性.
虽然在专业书籍中有许多信息,但是对StackOverflow进行一般性(尽管语言特定的提及很有趣!)解释/讨论会很好.
通常,不指向共享数据的局部变量是线程安全的.由于您通常只在一个线程中创建一个对象,因此它实际上是一个线程本地数据结构,因此线程安全(大多数情况下).
在Java中,您可以通过多种方式打破这种假设
在构造函数中启动一个新线程
设置对另一个线程可见的对象的引用.
使用非最终字段并将对象添加到线程不安全容器或共享数据结构.
通常这些操作都被认为是不好的做法,所以如果你避免使用这些操作,你就有了一个线程安全的构造函数,而不需要锁定.