Java docs说明了构造函数的同步:
请注意,构造函数无法同步 - 将synchronized关键字与构造函数一起使用是语法错误。同步构造函数没有意义,因为只有创建对象的线程在构造时才能访问它。
警告:构建将在其间共享的对象时 线程,要非常小心,对对象的引用不会 过早地“泄漏”。例如,假设您要维护List 调用包含每个类实例的实例。你可能是 试图将以下行添加到构造函数中: instances.add(本);但其他线程可以使用实例 在构造对象完成之前访问对象。
我无法理解整个街区。首先,它声明只有创建对象的线程才能访问构造函数。然后它警告过早泄漏,如果其他线程在构造完成之前访问对象,则可能导致问题。这两件事情不是矛盾的。如果只有创建线程可以访问构造函数,那么其他线程如何过早地访问该对象,因为只有在构造函数完全运行后才能访问它? 任何输入都会有很大的帮助。
答案 0 :(得分:2)
想象一下两个线程都可以访问一个包含相关类实例的全局List(称为“实例”)。线程1连续循环遍历列表并对每个实例执行某些操作。线程2采用自己的快乐方式,偶尔会构造一个新的类实例。如果类在其构造函数中将自己添加到List中(使用instances.add(this)),则线程1将立即获得对实例的访问权限,并且可以在完全构造之前对其执行操作,从而导致不可预测的行为。
可能存在对“应该”这个词的误解。您写道:“首先它声明只有创建对象的线程才能访问构造函数。”但是,Java文档说:“只有创建对象的线程在构造时才能访问它”,这意味着您应该注意在构造对象时只有一个线程可以访问该对象。