如何使Java.util.Date线程安全

pet*_*ter 16 java concurrency multithreading

据我所知,这java.util.Date是可变的,所以如果多个线程试图访问和修改它,它就不是线程安全的.我们如何使用客户端锁定或组合(包装器)使其线程安全?

Tom*_*icz 31

按顺序,从最好到最差:

  1. 根本不使用它,请查看

  2. 不使用它在所有,使用AtomicLong或一成不变的原始longvolatile代表纪元时间

  3. 封装它.始终返回防御性副本Date,从不引用内部对象

  4. Date实例上同步.

  • 既然[JSR 310](https://jcp.org/en/jsr/detail?id=310)获得批准,我建议第一个选择是**根本不使用它,查看[Java 8的新日期]和时间API](http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html).** (3认同)
  • @ user1389813:好问题!1.基元是不可变的,因此隐式线程安全.2.巧合的是,你不能返回对内部对象的引用而不是防御性副本.3.更轻巧,更少复制(不是很重要).不过我同意,2和3都很不错.显然`Date`比`long`有更好的语义. (2认同)