3

由于特定类型的所有零长度数组都是相同的,JVM 是否优化了零长度数组的分配以使用一个共享实例进行所有此类分配?

4

2 回答 2

4

不,它可能不会这样做,因为每个创建的零长度数组对象都可以用作不同的同步监视器。Quoth 甲骨文

同步是围绕称为内在锁或监视器锁的内部实体构建的......每个对象都有一个与之关联的内在锁。

例如,在下面的代码中,不同的线程可以调用x.methodA()并且x.methodB()没有阻塞。

 private final int[] a;
 private final int[] b;

 Ctor(int n) {
    a = new int[n];
    b = new int[n];
 }

 public final methodA() {
    synchronized(a) {
       ...
    }
 }

 public final methodB() {
    synchronized(b) {
       ...
    }
 }
于 2013-06-10T15:43:45.753 回答
1

new总是创建一个新对象。空数组是不可变的,可以使用缓存实例代替优化。但这是实现这种优化的程序员的职责。

于 2013-06-10T16:19:14.840 回答