[ThreadLocal 모드]스 레 드 의 전역 변수
4741 단어 자바스 레 드 보안성능 최적화ThreadLocal 모드
1.수명 주기 가 짧 은 인 스 턴 스(또는 예화 대가 가 비 싼)를 자주 만 들 면 성능 이 떨어진다.
2.스 레 드 안전 이 필요 합 니 다.'synchronized'스 레 드 동기 화 를 사용 하면 성능 이 떨 어 집 니 다.
다음은 Tim Cull 의 블 로그'Simple DateFormat:Performance Pig'가 이러한 수 요 를 만족 시 키 기 위해 ThreadLocal 모델 을 사용 한 안건 입 니 다.
Tim Cull 은 다음 과 같이 썼 다.
Tim Cull 은 Simple DateFormat 이 가 져 온 심각 한 성능 문제 에 부 딪 혔 습 니 다.이 문 제 는 Simple DateFormat 으로 인해 발생 합 니 다.Simple DateFormat 인 스 턴 스 를 만 드 는 비용 이 비교적 비 싸 고 문자열 을 분석 할 때 수명 주기 가 짧 은 인 스 턴 스 를 자주 만 들 면 성능 이 떨 어 집 니 다.Simple DateFormat 을 정적 클래스 변수 로 정의 하 더 라 도 이 문 제 를 해결 할 수 있 을 것 같 습 니 다.그러나 Simple DateFormat 은 비 스 레 드 가 안전 하고 문제 가 있 습 니 다.'synchronized'스 레 드 로 동기 화 하 는 것 도 문제 가 있 으 면 동기 화 되 어 성능 이 떨 어 집 니 다(스 레 드 간 서열 화 된 Simple DateFormat 인 스 턴 스 획득).
Tim Cull 은 Threadlocal 을 사용 하여 이 문 제 를 해 결 했 습 니 다.모든 스 레 드 Simple DateFormat 에 영향 을 주지 않 고 모든 스 레 드 에 Simple DateFormat 변 수 를 복사 하거나 복사 본 이 라 고 부 릅 니 다.
public class DateUtil {
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
@SuppressWarnings("rawtypes")
private static ThreadLocal threadLocal = new ThreadLocal() {
protected synchronized Object initialValue() {
return new SimpleDateFormat(DATE_FORMAT);
}
};
public static DateFormat getDateFormat() {
return (DateFormat) threadLocal.get();
}
public static Date parse(String textDate) throws ParseException {
return getDateFormat().parse(textDate);
}
} 다음은 정적 카운터(/단일 모드)를 만 들 었 습 니 다. 화해시키다 ThreadLocal 모드 카운터 비교 결과 ThreadLocal 모드 에서
스 레 드 가 안전 하고 모든 스 레 드 는 자신의 독립 사본 이 있 습 니 다.
스 레 드 안의 각 방법 과 차원 은 이 변 수 를 사용 할 수 있 습 니 다.다시 예화 하거나 전 삼[예 를 들 어 Struts 의 Action Context]을 사용 하지 않 아 도 됩 니 다.
public class Counter {
public static Integer number =10;
} public class LocalCounter {
public Integer number =10;
private static ThreadLocal<LocalCounter> counter = new ThreadLocal<LocalCounter>(){
protected synchronized LocalCounter initialValue(){
return new LocalCounter();
}
};// , get null, set
public static LocalCounter getCounter() {
return (LocalCounter) counter.get();
}
public static void setCounter(LocalCounter counterFrom){
counter.set(counterFrom);
}
} public class ThreadLocalStub extends Thread {
public void run() {
for (int i = 0; i < 2; i++) {
LocalCounter localCounter = LocalCounter.getCounter();//
System.out.println("Thread[" + Thread.currentThread().getName()
+ "],localCounter=" + localCounter.number++);
System.out.println("Thread[" + Thread.currentThread().getName()
+ "],Counter=" + Counter.number++);
LocalCounter.setCounter(localCounter);
}
nextAdd();
}
private void nextAdd(){
LocalCounter localCounter = LocalCounter.getCounter();// ,
System.out.println("Thread[" + Thread.currentThread().getName()
+ "],localCounter=" + localCounter.number++);
System.out.println("Thread[" + Thread.currentThread().getName()
+ "],Counter=" + Counter.number++);
LocalCounter.setCounter(localCounter);
}
} public class ThreadLocalTest {
public static void main(String[] args) {
ThreadLocalStub testThread1 = new ThreadLocalStub();
ThreadLocalStub testThread2 = new ThreadLocalStub();
ThreadLocalStub testThread3 = new ThreadLocalStub();
testThread1.start();
testThread2.start();
testThread3.start();
}
} 실행 결과:
Thread[Thread-0],localCounter=10
Thread[Thread-1],localCounter=10
Thread[Thread-0],Counter=10
Thread[Thread-1],Counter=11
Thread[Thread-1],localCounter=11
Thread[Thread-1],Counter=12
Thread[Thread-1],localCounter=12
Thread[Thread-1],Counter=13
Thread[Thread-2],localCounter=10
Thread[Thread-2],Counter=14
Thread[Thread-2],localCounter=11
Thread[Thread-2],Counter=15
Thread[Thread-2],localCounter=12
Thread[Thread-2],Counter=16
Thread[Thread-0],localCounter=11
Thread[Thread-0],Counter=17
Thread[Thread-0],localCounter=12
Thread[Thread-0],Counter=18
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.