높은 동시 사용 가능 시스템currentTimeMillis()의 최적화

1467 단어
System이currentTime Millis () 가 느린 것은 매번 호출할 때마다 시스템과 한 번 접촉하기 때문이다. 높은 병발 상황에서 대량의 병발 시스템 호출은 성능에 영향을 미치기 쉽다. (그것의 호출은 심지어 new의 일반 대상보다 시간이 걸린다. 왜냐하면 new가 발생하는 대상은 자바 메모리의 무더기에만 있기 때문이다.)메모리에 최신 시간을 캐시하고, 밀리초에 한 번씩 수호 라인을 사용하여 업데이트하면 프로그램의 성능을 크게 향상시킬 수 있다.최적화된 후에 빈번한 실행 시스템에서 한 라인만 호출되고 서로 다른 시간에 분포된다.코드는 다음과 같다.
package com.tvl.job.core.sequence;

import java.sql.Timestamp;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

/**
 * @description
 * @author st.z
 */
public class SystemClock {

	private final int period;

	private final AtomicLong now;

	private static final SystemClock INSTANCE = new SystemClock(1);

	private SystemClock(int period) {
		this.period = period;
		now = new AtomicLong(System.currentTimeMillis());
		scheduleClockUpdating();
	}

	private void scheduleClockUpdating() {
		ScheduledExecutorService scheduleService = Executors.newSingleThreadScheduledExecutor((r) -> {
			Thread thread = new Thread(r);
			thread.setDaemon(true);
			return thread;
		});
		scheduleService.scheduleAtFixedRate(() -> {
			now.set(System.currentTimeMillis());
		}, 0, period, TimeUnit.MILLISECONDS);
	}

	private long get() {
		return now.get();
	}

	public static long now() {
		return INSTANCE.get();
	}

	public static String nowDate() {
		return new Timestamp(now()).toString();
	}

}

좋은 웹페이지 즐겨찾기