Thread 클래스의 threadLocals

3495 단어 다중 스레드
ThreadLocal은 1.6 버전에서 하나의 전역적인 맵으로 각 라인의 변수 복사본을 저장하는 것이 아니라 Thread 클래스에 ThreadLocalMap의 변수가 있고 Thread를 사용합니다.currentThread().threadLocals.get(this)에서 인용하는 각 라인 변수 복사본으로 전역적인 맵을 동기화하지 않습니다
 
ThreadLocal에서 사용하는 간단한 예:
 
 
package com.test;

public class TestNum {
	// ①         ThreadLocal initialValue()  ,     
	private static ThreadLocal seqNum = new ThreadLocal() {
		public Integer initialValue() {
			return 0;
		}
	};

	// ②        
	public int getNextNum() {
		seqNum.set(seqNum.get() + 1);
		return seqNum.get();
	}

	public static void main(String[] args) {
		TestNum sn = new TestNum();
		// ③ 3     sn,       
		TestClient t1 = new TestClient(sn);
		TestClient t2 = new TestClient(sn);
		TestClient t3 = new TestClient(sn);
		t1.start();
		t2.start();
		t3.start();
	}

	private static class TestClient extends Thread {
		private TestNum sn;

		public TestClient(TestNum sn) {
			this.sn = sn;
		}

		public void run() {
			for (int i = 0; i < 3; i++) {
				// ④      3    
				System.out.println("thread[" + Thread.currentThread().getName() + "] --> sn["
						 + sn.getNextNum() + "]");
			}
		}
	}
}

 
일반적으로 ThreadLocal의 하위 클래스를 익명으로 정의하여 초기 변수 값을 제공합니다. 예를 들어 ① 참조.TestClient 스레드는 일련의 번호를 생성하고 ③에서 우리는 3개의 TestClient를 생성하여 같은 TestNum 실례를 공유한다.위 코드를 실행하여 콘솔에서 다음 결과를 출력합니다.
  thread[Thread-0] --> sn[1]
thread[Thread-1] --> sn[1]
thread[Thread-2] --> sn[1]
thread[Thread-1] --> sn[2]
thread[Thread-0] --> sn[2]
thread[Thread-1] --> sn[3]
thread[Thread-2] --> sn[2]
thread[Thread-0] --> sn[3]
thread[Thread-2] --> sn[3]
 
출력의 결과 정보를 살펴보면 각 스레드에서 발생하는 번호는 모두 같은TestNum 실례를 공유하지만 서로 간섭하는 상황이 발생하지 않고 각자 독립된 시퀀스 번호를 생성하는 것을 알 수 있다. 이것은 우리가 ThreadLocal을 통해 모든 스레드에 단독 복사본을 제공했기 때문이다.
 
 
위의 예에서 자신의 클래스에서ThreadLocal을 정의한 경우 Thread를 직접 사용할 수 있습니까?currentThread().threadLocals?
 
threadLocals 변수가 Thread에 있을 때 패키지 접근 권한 때문에 같은 패키지 아래에서만 접근할 수 없습니다.
 
그러나 반사를 통해threadLocals의 내용을 얻을 수 있습니다. 참고:
 
http://stackoverflow.com/questions/2001353/java-list-thread-locals
 
 
threadLocals는 무엇에 쓰입니까?
 
여러 ThreadLocal 인스턴스가 스레드에 저장됩니다.
 
 
 
ThreadLocal은 먼저 현재 스레드 t를 통해threadLocals를 얻은 다음에 자신의this를 키로 삼아threadLocals에서 스레드 로컬에 저장된 관련 데이터를 얻는다
 
ThreadLocal에서 get 및 set 메서드는 다음과 같습니다.
 
 
 public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }
 
 
 
  public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null)
                return (T)e.value;
        }
        return setInitialValue();
    }
    
    
여기서 getMap 방법은 다음과 같습니다.
    
  ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }
 
 
 
 
총괄ThreadLocal 원리: ThreadLocal 대상은 라인 사유재산(데이터)의 매니저에 해당하고 라인의 사유재산(데이터)에 저장과 획득 기능을 제공한다.
 
 
 
 
 
 
 
 
 
 
 
 
 
 

좋은 웹페이지 즐겨찾기