Java의 ThreadLocal 클래스는 생성한 변수가 동일한 스레드에서만 읽고 쓸 수 있도록 보장합니다. 따라서 두 스레드가 동일한 코드를 실행하고 해당 코드에 ThreadLocal 변수에 대한 참조가 있더라도 두 스레드는 서로의 ThreadLocal 변수를 볼 수 없습니다.
ThreadLocal 생성
다음은 ThreadLocal을 생성하는 방법을 보여주는 코드입니다.
private ThreadLocal myThreadLocal = new ThreadLocal();
As you 예, 새 ThreadLocal 개체를 인스턴스화합니다. 이 작업은 스레드당 한 번만 수행하면 됩니다. 서로 다른 스레드가 ThreadLocal에 액세스하는 동일한 코드를 실행하더라도 각 스레드는 자체 ThreadLocal 인스턴스만 볼 수 있습니다. 두 스레드가 동일한 ThreadLocal 객체에 서로 다른 값을 설정하더라도 서로의 값을 볼 수는 없습니다.
ThreadLocal 액세스
ThreadLocal이 생성되면 다음과 같이 저장할 값을 설정할 수 있습니다.
myThreadLocal.set("A thread local value");
다음과 같이 값을 읽을 수 있습니다.
String threadLocalValue = (String) myThreadLocal.get();
get 메소드는 객체를 반환하고 set 메소드는 객체를 매개변수로 전달합니다.
일반 ThreadLocal
get 메소드 강제 변환 호출 시 별도의 작업을 수행하지 않아도 되도록 일반 ThreadLocal을 생성할 수 있습니다. 예는 다음과 같습니다.
private ThreadLocal<String> myThreadLocal = new ThreadLocal<String>();
이제 ThreadLocal 인스턴스에만 문자열 유형을 저장할 수 있습니다. 또한 이 값을 강제로 변환할 필요는 없습니다:
myThreadLocal.set("Hello ThreadLocal"); String threadLocalValue = myThreadLocal.get();
ThreadLocal 값 초기화
ThreadLocal 객체 이 값을 설정하는 스레드에만 표시되므로 어떤 스레드도 set 메소드를 사용하여 모든 스레드에 표시되도록 ThreadLocal 값을 설정할 수 없습니다.
대신 ThreadLocal을 서브클래싱하고initialValue 메서드를 재정의하여 ThreadLocal 객체의 초기 값을 지정할 수 있습니다.
private ThreadLocal myThreadLocal = new ThreadLocal<String>() { @Override protected String initialValue() { return "This is the initial value"; } };
이제 모든 스레드는 set 메소드를 호출하기 전에 동일한 초기화 값을 볼 수 있습니다.
전체 ThreadLocal 인스턴스
다음은 완전히 실행 중인 ThreadLocal 인스턴스입니다
public class ThreadLocalExample { public static class MyRunnable implements Runnable { private ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(); @Override public void run() { threadLocal.set( (int) (Math.random() * 100D) ); try { Thread.sleep(2000); } catch (InterruptedException e) { } System.out.println(threadLocal.get()); } } public static void main(String[] args) { MyRunnable sharedRunnableInstance = new MyRunnable(); Thread thread1 = new Thread(sharedRunnableInstance); Thread thread2 = new Thread(sharedRunnableInstance); thread1.start(); thread2.start(); thread1.join(); //wait for thread 1 to terminate thread2.join(); //wait for thread 2 to terminate } }
이 예는 별도의 MyRunnable 인스턴스를 생성합니다. 두 개의 다른 스레드로 전달됩니다. 두 스레드 모두 run 메소드를 실행하고 ThreadLocal 인스턴스에 서로 다른 값을 설정했습니다. 이 set 메서드에 대한 호출이 동기적이고 ThreadLocal 개체를 사용하지 않는 경우 두 번째 스레드는 첫 번째 스레드에서 설정한 값을 덮어씁니다.
단, ThreadLocal 객체이기 때문에 서로의 값을 볼 수는 없습니다. 따라서 서로 다른 값을 설정하고 얻습니다.
InheritableThreadLocal
이 InheritableThreadLocal 클래스는 ThreadLocal 클래스의 하위 클래스입니다. ThreadLoca 내에서 각 스레드가 자체 값을 갖는 대신 이 클래스를 사용하면 하나의 스레드와 해당 스레드에 의해 생성된 모든 하위 스레드의 값에 액세스할 수 있습니다.
위 내용은 Java 로컬 스레드(ThreadLocal) 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!