java – 在多线程环境中以下列方式构造对象是否安全
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在多线程环境中以下列方式构造对象是否安全,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1705字,纯文字阅读大概需要3分钟。
内容图文
![java – 在多线程环境中以下列方式构造对象是否安全](/upload/InfoBanner/zyjiaocheng/790/f54b5d572664401789fc805c64b002b2.jpg)
public class DataEvent {
private static final AtomicInteger lastRevision = new AtomicInteger();
private final int revision;
private final long threadId;
private final long timestamp;
private DataEvent(int revision) {
this.revision = revision;
this.threadId = Thread.currentThread().getId();
this.timestamp = System.nanoTime();
}
public static DataEvent newInstance() {
return new DataEvent(lastRevision.incrementAndGet());
}
}
我的问题如下:
>说完所有对象将一个接一个地构造是完全正确的吗?我的意思是每个新对象都是在之前的对象之后构建的.换句话说,每个新对象的时间戳都比前一个更大.
> final关键字如何影响此行为?据我所知,如果所有对象字段都是最终的,那么它会以某种方式使构造函数成为原子.在初始化所有最终字段之前,不会发布引用.
>构建此类对象的最佳做法是什么?是否足以使lastRevision原子或newInstance应声明为synchronized?
解决方法:
is it absolutely correct to say that all objects will be constructed
consistently one by one
不,lastRevision.incrementAndGet()是一个阻塞调用,但调度程序可以在收到第一个ID后暂停第一个线程,然后在第二个线程收到第二个ID后恢复它,这意味着两个构造函数将同时执行.
In other words each new object has timestamp that is bigger then
previous one.
不,见上文.
how
final
keyword affects this behavior?
它没有.
As I understand if all object fields are final then it makes
constructor atomic in some way
不正确.如果每个字段都是final,那么一个类是不可变的*,这使得它隐式地是线程安全的.
what is best practice to construct such objects? Is is enough to make
lastRevision
atomic ornewInstance
should be declared as synchronized?
如果必须以串行方式创建每个实例,则应同步newInstance.一旦它,原子整数就没有意义了.即使您这样做,时间戳也可能仍然相同,具体取决于底层系统时钟的分辨率.
*嗯,不完全是.如果每个字段都是最终字段,并且本身也是不可变的.
内容总结
以上是互联网集市为您收集整理的java – 在多线程环境中以下列方式构造对象是否安全全部内容,希望文章能够帮你解决java – 在多线程环境中以下列方式构造对象是否安全所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。