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

标签 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)? 创建了两个对象,并且它们在不同时间创建了不同的属性,所以为什么?

最佳答案

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

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

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

关于java - 为什么 getStamp() 返回相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12283306/

相关文章:

java - Java 的 SAAS 框架

java - 直接从 Windows 剪贴板获取二进制数据

java - 无法向 SMTP 主机发送电子邮件

java - Seam @Transactional 注释的正确用法是什么?

android - TimePickerDialog 主题改变

c++ - struct 和 time_t 的计算错误

r - 从日期和小时格式更改为数字格式

java - 在netbeans的JList中添加文本和图像

C++主循环定时器

java - 如何在一定的时间间隔后重复调用一个方法?