构造函数

时间:2015-08-01 16:18:41

标签: multithreading constructor synchronization

Java docs说明了构造函数的同步:

  

请注意,构造函数无法同步 - 将synchronized关键字与构造函数一起使用是语法错误。同步构造函数没有意义,因为只有创建对象的线程在构造时才能访问它。

     

警告:构建将在其间共享的对象时   线程,要非常小心,对对象的引用不会   过早地“泄漏”。例如,假设您要维护List   调用包含每个类实例的实例。你可能是   试图将以下行添加到构造函数中:   instances.add(本);但其他线程可以使用实例   在构造对象完成之前访问对象。

我无法理解整个街区。首先,它声明只有创建对象的线程才能访问构造函数。然后它警告过早泄漏,如果其他线程在构造完成之前访问对象,则可能导致问题。这两件事情不是矛盾的。如果只有创建线程可以访问构造函数,那么其他线程如何过早地访问该对象,因为只有在构造函数完全运行后才能访问它? 任何输入都会有很大的帮助。

1 个答案:

答案 0 :(得分:2)

想象一下两个线程都可以访问一个包含相关类实例的全局List(称为“实例”)。线程1连续循环遍历列表并对每个实例执行某些操作。线程2采用自己的快乐方式,偶尔会构造一个新的类实例。如果类在其构造函数中将自己添加到List中(使用instances.add(this)),则线程1将立即获得对实例的访问权限,并且可以在完全构造之前对其执行操作,从而导致不可预测的行为。

可能存在对“应该”这个词的误解。您写道:“首先它声明只有创建对象的线程才能访问构造函数。”但是,Java文档说:“只有创建对象的线程在构造时才能访问它”,这意味着您应该注意在构造对象时只有一个线程可以访问该对象。