>Java >java지도 시간 >ThreadLocal이란 무엇입니까? ThreadLocal의 원리 분석

ThreadLocal이란 무엇입니까? ThreadLocal의 원리 분석

不言
不言앞으로
2018-10-11 16:37:3810890검색

이 기사에서는 ThreadLocal이 무엇인지 소개합니다. ThreadLocal의 원리 분석에는 특정 참고 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

1. ThreadLocal이란 무엇인가요?

ThreadLocal은 스레드 로컬 변수를 제공합니다. 이러한 변수는 해당 변수에 액세스하는 각 스레드(get 또는 set 메소드를 통해)가 독립적으로 초기화된 자체 변수 복사본을 갖는다는 점에서 일반 변수와 다릅니다.

ThreadLocal 인스턴스는 일반적으로 상태를 스레드(예: 사용자 ID 또는 트랜잭션 ID 등)와 연결하려는 클래스의 비공개 정적 필드입니다.

(음성 해설: 이 구절은 세 가지 의미를 표현합니다

1. ThreadLocal은 "스레드 지역 변수"라고 부르는 변수 유형입니다.

2. 각 스레드는 액세스할 때 이 변수를 생성합니다. 변수의 복사본입니다.

3. ThreadLocal 유형 변수는 일반적으로 비공개 정적 변수로 수정됩니다. )

예를 들어 다음 예에서 이 클래스는 각 스레드에 대한 고유 식별자를 생성합니다. 스레드의 ID는 ThreadId.get() 메서드를 처음 호출할 때 지정됩니다.

package com.cjs.example;
import java.util.concurrent.atomic.AtomicInteger;
public class ThreadId {
    private static final AtomicInteger nextId = new AtomicInteger(0);
    private static final ThreadLocal<Integer> threadId = new ThreadLocal<Integer>() {
        @Override
        protected Integer initialValue() {
            return nextId.getAndIncrement();
        }
    };
    public static int get() {
        return threadId.get();
    }
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getId());
                }
            }).start();
        }
    }
}

2. ThreadLocal 주요 작업

/**
 * 返回当前线程对ThreadLocal变量的“初始值”
 * 这个方法将在线程第一次访问变量(通过调用get方法)时被调用,如果之前已经调用过了就不会再调了
 *
 * @return the initial value for this thread-local
 */
protected T initialValue() {
    return null;
}

/**
 * 设置当前线程的ThreadLocal变量的副本为指定的值
 *
 * @param value the value to be stored in the current thread&#39;s copy of this thread-local.
 */
public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}
/**
 * 返回当前线程的ThreadLocal变量副本的值
 *
 * @return the current thread&#39;s value of this thread-local
 */
public T get() {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            return result;
        }
    }
    return setInitialValue();
}

/**
 * 删除当前线程的ThreadLocal变量副本的值
 */
public void remove() {
    ThreadLocalMap m = getMap(Thread.currentThread());
    if (m != null)
        m.remove(this);
}

3. 소스 코드 읽기

3.1. 메소드 설정

바닥이 보이시죠 ThreadLocalMap의 레이어는 배열입니다. 배열의 요소 유형은 항목 유형입니다. 설정 작업은 현재 스레드의 ThreadLocal.ThreadLocalMap 유형의 멤버 변수 threadLocals에 값을 설정하는 것입니다. 여기서 지정한 값은 ThreadLocal 유형 변수(또는 객체)입니다.

즉, 각 스레드는 ThreadLocal.ThreadLocalMap 유형의 객체를 유지하고 설정 작업은 실제로 ThreadLocal 변수를 키로 사용합니다. 우리가 지정하는 값은 value이며, 마지막으로 이 키-값 쌍을 Entry 객체로 캡슐화하고 이를 스레드의 ThreadLocal.ThreadLocalMap 객체에 넣습니다. 스레드의 각 ThreadLocal 변수는 ThreadLocal.ThreadLocalMap 개체의 항목입니다. 각 ThreadLocal 변수는 ThreadLocal.ThreadLocalMap의 요소에 해당하므로 이러한 요소를 읽고, 쓰고, 삭제할 수 있습니다.

3.2.get 메소드

get() 메소드는 현재 스레드의 ThreadLocal.ThreadLocalMap 객체에서 해당 ThreadLocal 변수에 해당하는 값을 가져오는 것입니다

마찬가지로 Remove() 메소드는 Clear하는 것입니다. 이 값

그래픽 표현에서는 다음과 같습니다:

또는 다음과 같습니다:

4. ThreadLocal 사용 시나리오

스레드 수명 주기 내에서 값 전송

결국 모든 것은 ThreadLocalMap 덕분입니다

위 내용은 ThreadLocal이란 무엇입니까? ThreadLocal의 원리 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제