Java16 - 对基于值的类的警告
有些类,例如 java.util.Optional 和 java.time.LocalDateTime,是基于值的。 这种基于值的类的实例是最终的和不可变的。 此类 classes 类具有注解 @jdk.internal.ValueBased 并且 Java16 现在会生成编译时警告,以防此类 classes 类使用 synchronized 关键字进行同步。 包装器类是基于值的。 例如,Double 类是基于值的。
示例
package java.lang; @jdk.internal.ValueBased public final class Double extends Number implements Comparable<Double>, Constable, ConstantDesc { //... }
考虑以下示例:
ApiTester.java
示例
public class APITester { public static void main(String[] args) { Double d = 10.0; synchronized (d) { System.out.println(d); } } }
编译并运行程序
$javac APITester.java
输出
APITester.java:4: warning: [synchronization] attempt to synchronize on an instance of a value-based class synchronized (d) { ^ 1 warning