Java new 对象是否是原子性的?
public static void main(Sting args[]){
Object a=null;
new Thread(){
a=new xxx()
}.start();
new Thread(){
a=new xxx()
}.start();
}
想问,xxx()方法里有复杂的对象初始化逻辑,new关键字创建对象,是原子性的吗?如果不是,会不会就出现了对象初始化错乱的问题?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
没明白你的意思,如果我猜得不错的话:
这完全取决于你的构造方法里面的具体的逻辑,毕竟代码是人写的。
输出:
另一个例子,构造器中包含同步块,每一个线程都需要等待前面的线程执行完成后才能执行。
输出:
建议参考线程安全的单例模式
不具有,比如构造方法中写了多条逻辑,在执行构造方法时,是可以中断的。
“原子性”这种描述太抽象,楼主提问的时候最好不要认为所有人对某个词的认识都完全一样。我只能说构造方法是线程安全的,对于每一个对象,构造方法只会被执行一次,只会被一个线程执行。
初始化过程是分成几个步骤的,比如:分配空间、初始化对象值、将对象指向空间,最关键的是这几个步骤间还有可能乱序重排,导致部分初始化情况出现(可以参照单例模式的DCL模式),所以为了保证正确初始化,通常对象上要加volatile禁止重排
不是原子性的。