public class SystemClock extends Object
System.currentTimeMillis()以毫秒为单位返回当前时间。 请注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,并且可能更大。 例如,许多操作系统以几十毫秒为单位测量时间。说明该方法存在时间误差,有精度问题,大概误差在几十毫秒内,因操作系统而异。
System.currentTimeMillis()在高并发场景下之所以慢是因为去跟系统打了一次交道, 而系统只有一个全局时钟源,高并发或频繁访问会造成严重的争用,因此可采用如下三种策略优化:
一、如果对时间精确度要求不高的话可以使用独立线程缓存时间戳:如果我们的误差允许在1ms内,那我们保证在1ms内只调用一次System.currentTimeMillis(), 在1ms内的其他调用都直接使用这次调用的结果这样就大大避免了和其他线程抢夺资源的概率。 也减少了线程上下文的切换,以及用户态到内核态的切换。
二、使用Linux的clock_gettime()方法:使用JNI自己实现它。
三、使用System.nanoTime() 本类采用第一种策略实现