Last active
November 9, 2016 15:09
-
-
Save syhily/7a82276f19cd53270206 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.concurrent.Executors; | |
import java.util.concurrent.ScheduledExecutorService; | |
import java.util.concurrent.ThreadFactory; | |
import java.util.concurrent.TimeUnit; | |
import java.util.concurrent.atomic.AtomicLong; | |
/** | |
* Title: SystemClock <br> | |
* Description: 高并发场景下System.currentTimeMillis()的性能问题的优化。<br> | |
* System.currentTimeMillis()的调用比new一个普通对象要耗时的多 | |
* System.currentTimeMillis()之所以慢是因为去跟系统打了一次交道 | |
* 后台定时更新时钟,JVM退出时,线程自动回收 | |
* | |
* @author yufan.sheng | |
* @version 1.0.0 | |
* @since 15/8/27 下午2:36 | |
*/ | |
public class SystemClock { | |
private final long period; | |
private final AtomicLong now; | |
private SystemClock(long period) { | |
this.period = period; | |
now = new AtomicLong(System.currentTimeMillis()); | |
scheduleClockUpdating(); | |
} | |
private static class InstanceHolder { | |
public static final SystemClock INSTANCE = new SystemClock(1); | |
} | |
private static SystemClock instance() { | |
return InstanceHolder.INSTANCE; | |
} | |
private void scheduleClockUpdating() { | |
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { | |
@Override | |
public Thread newThread(Runnable runnable) { | |
Thread thread = new Thread(runnable, "System Clock"); | |
thread.setDaemon(true); | |
return thread; | |
} | |
}); | |
scheduler.scheduleAtFixedRate(new Runnable() { | |
@Override | |
public void run() { | |
now.set(System.currentTimeMillis()); | |
} | |
}, period, period, TimeUnit.MILLISECONDS); | |
} | |
private long currentTimeMillis() { | |
return now.get(); | |
} | |
public static long now() { | |
return instance().currentTimeMillis(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment