为了账号安全,请及时绑定邮箱和手机立即绑定

在多线程环境中以下列方式构造对象是否安全 问问题

在多线程环境中以下列方式构造对象是否安全 问问题

元芳怎么了 2022-08-03 09:57:28
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());    }}My questions are following:is it absolutely correct to say that all objects will be constructed consistently one by one? I mean that every new object is constructed later then previous one. In other words each new object has that is bigger then previous one.timestamphow keyword affects this behavior? As I understand if all object fields are then it makes constructor atomic in some way. Reference is not published until all fields are initialized.finalfinalfinalwhat is best practice to construct such objects? Is is enough to make atomic or should be declared as ?lastRevisionnewInstancesynchronized
查看完整描述

2 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

说所有对象都将一个接一个地一致地构造是绝对正确的吗?

哈哈 是阻塞调用,但调度程序可以在收到第一个 ID 后暂停第一个线程,然后在第二个线程收到第二个 ID 后恢复它,这意味着两个构造函数将同时执行。lastRevision.incrementAndGet()

换句话说,每个新对象的时间戳都比前一个对象大。

不,见上文。

关键字如何影响此行为?final

事实并非如此。

据我所知,如果所有对象字段都是最终的,那么它就会以某种方式使构造函数成为原子的。

不對。如果每个字段都是最终的,那么一个类是不可变的*,这使得它隐式线程安全。

构造此类对象的最佳实践是什么?是否足以使原子化或应声明为同步?lastRevisionnewInstance

如果必须按顺序创建每个实例,则应进行同步。一旦是,原子整数就没有意义了。即使这样做,时间戳可能仍然相同,具体取决于基础系统时钟的分辨率。newInstance


*嗯,不完全是。如果每个字段都是最终的,并且本身也是不可变的


查看完整回答
反对 回复 2022-08-03
?
心有法竹

TA贡献1866条经验 获得超5个赞

  • 原子性保证仅对调用有效。所以,是的,对于每个新对象,修订将是连续的,这是原子数据类型的目的。因此,为了回答您的问题:不能保证多个线程将按照调用 时相同的顺序执行构造函数中的语句。要实现此目的,您必须将此部分放在块中。incrementAndGet()incrementAndGet()synchronized

  • finals在这里没有帮助。它们是纯粹的逻辑功能,不允许在对象创建后改变字段。

  • 如果您确实需要时间戳与修订对齐,则必须引入某种形式的线程同步。您可以使整个方法同步,然后不必是原子的。lastRevision

此外,无论您决定做什么,您可能还需要检查其自身提供的保证。咔嚓System.nanoTime()


查看完整回答
反对 回复 2022-08-03
  • 2 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号