为什么getStamp()返回相同的值?

时间:2012-09-05 14:05:39

标签: java time

我在Thinking in Java中阅读了这段代码并感到困惑:

    package generics;

    //: generics/Mixins.java
    import java.util.*;

    interface TimeStamped { long getStamp(); }

    class TimeStampedImp implements TimeStamped {
      private final long timeStamp;
      public TimeStampedImp() {
        timeStamp = new Date().getTime();
      }
      public long getStamp() { return timeStamp; }
    }

    interface SerialNumbered { long getSerialNumber(); }

    class SerialNumberedImp implements SerialNumbered {
      private static long counter = 1;
      private final long serialNumber = counter++;
      public long getSerialNumber() { return serialNumber; }
    }

    interface Basic {
      public void set(String val);
      public String get();
    }

    class BasicImp implements Basic {
      private String value;
      public void set(String val) { value = val; }
      public String get() { return value; }
    }

    class Mixin extends BasicImp
    implements TimeStamped, SerialNumbered {
      private TimeStamped timeStamp = new TimeStampedImp();
      private SerialNumbered serialNumber =
        new SerialNumberedImp();
      public long getStamp() { return timeStamp.getStamp(); }
      public long getSerialNumber() {
        return serialNumber.getSerialNumber();
      }
    }

    public class Mixins {
      public static void main(String[] args) {
        Mixin mixin1 = new Mixin(), mixin2 = new Mixin();
        mixin1.set("test string 1");
        mixin2.set("test string 2");
        System.out.println(mixin1.get() + " " +
          mixin1.getStamp() +  " " + mixin1.getSerialNumber());
        System.out.println(mixin2.get() + " " +
          mixin2.getStamp() +  " " + mixin2.getSerialNumber());
        while(true)System.out.println(new Date().getTime());
      }
    } /* Output: (Sample)
    test string 1 1132437151359 1
    test string 2 1132437151359 2
    *///:~

为什么getStamp()返回的值相同? (1132437151359 == 1132437151359)? 创建了两个对象,它们在不同的时间创建了不同的propoties,为什么?

3 个答案:

答案 0 :(得分:1)

使用序列号的时间不是一个好主意。您获得相同时间的原因可能是因为代码运行得相当快,并且在第一个对象和第二个对象的实例化之间没有足够的时间。时间戳以毫秒为单位返回,因此如果两个对象的实例化彼此相差1ms,您将看不到差异。

如果增加系统负载,可能会发现差异,或者使用Thread.sleep(5)导致程序暂停。两种方法都不是很好。

请使用UUID

,而不是将时间用于唯一ID

答案 1 :(得分:1)

表达式new Date().getTime()是一种做System.currentTimeMillis()的慢速方法,其最小分辨率为1毫秒(但在某些操作系统上可能高达16毫秒)

这意味着如果调用该方法的时间间隔小于1毫秒,则可以得到相同的结果。

更好的选择是使用AtomicLong.getAndIncrement()作为ids。

答案 2 :(得分:0)

尝试这样的事情:

Mixin mixin1 = new Mixin();
Thread.sleep(10);
Mixin mixin2 = new Mixin();

现在你在创建这两个对象的过程中暂停了10毫秒。

你的课很简单,你的计算机速度很快,所以两个瞬间之间的距离很小,以至于Java无法看到它。