Java 16 - 基于值的类的警告


某些类(例如 java.util.Optional 和 java.time.LocalDateTime)是基于值的。基于值的类的此类实例是最终的且不可变的。此类类具有注释@jdk.internal.ValueBased,并且 Java 16 现在会在此类类使用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