【问题标题】:How does Java's record class implement synchronization?Java的记录类是如何实现同步的?
【发布时间】:2021-04-16 07:28:14
【问题描述】:

由于 Record 类实例没有普通 Object 实例具有的 obj 标头。但我们仍然可以使用同步功能,例如:

public record User(long id, String name, int age) {}

User user = new User(1, "name", 18);
synchronized (user) {
    user.wait();
    System.out.println("test");
}

会不会有类似普通Object实例从轻量锁到重锁转换的过程?

【问题讨论】:

  • 记录的实例是与任何其他对象一样的对象,因此您可以像在任何其他对象上一样对其进行同步。
  • 您从哪里读到的记录在其元数据中没有固定锁?
  • 当你做一个粗体的陈述比如记录实例没有对象头时,你应该提供一个来源。
  • 很多人似乎对记录(现在 Java 中的一个特性)和原始类(一个通过 Project Valhalla 进入未来 Java 的特性)感到困惑。它们有很多共同点,社区中有很多噪音将两者混为一谈,所以我怀疑她/他受到了影响。

标签: java java-16


【解决方案1】:

Java 的record 类是普通的类,具有对象标识以及它们附带的所有东西(如监视器。)

也就是说,如果您发现自己在 record 上进行同步,那么您可能做错了什么;记录的状态是不可变的(所有字段都是最终的),所以不清楚为什么要锁定记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 2017-12-08
    相关资源
    最近更新 更多