Simulation ThreadLocal 클래스 구현 : 스레드 범위 내에서 공유 변수, 각 스레드는 액세스 할 수 있으며 다른 스레드에 액세스 할 수 없습니다.
com.ljq.test.thread java.util.map; AB MODULE * @Author Administrator */Public Class ResudScopesharedata {// 공유 데이터를 준비합니다 <스레드, integer> (); public static void main (string [] args) {// (int i = 0; i <2; i ++) {새 스레드 (new Runnabl d run () { // 이제 데이터를 수정하고 수정 정보 int intrind (); .out.println (getName () + " + data (); ;}} static class a {public void get () {int data = threaddata.get (thread.currentthread ()); public void get () {int data.get (stread.currentthread ());
실행 결과 :
ThreadLocal의 역할과 목적 :
스레드에서의 데이터 공유의 경우, 즉 동일한 프로그램 코드의 경우 동일한 스레드에서 실행할 때 여러 모듈을 공유해야하며 다른 스레드에서 실행할 때 다른 데이터가 공유됩니다.
각 스레드는 글로벌 ThreadLocal 객체의 설정 방법을 호출합니다. 이는 내부 맵에 레코드를 추가하는 것과 같습니다. 스레드가 끝나면 threadlocal.clear () 메소드를 호출하여 메모리가 더 빨리 해제되도록 할 수 있으며 스레드가 관련 스레드 Local 변수를 자동으로 해제 할 수 있으므로 호출해도 괜찮습니다.
ThreadLocal의 응용 프로그램 시나리오 :
주문 처리에는 일련의 작업이 포함되어 있습니다. 재고를 줄이고, 실행중인 계정을 추가하고, 일반적인 계정을 수정하십시오. 그렇지 않으면 모든 작업이 제출되며 이러한 작업에서 동일한 데이터베이스 연결 객체를 사용해야하며 이러한 작업의 코드는 다른 모듈 클래스에 있습니다.
은행에는 일련의 운영이 포함됩니다. 계정에서 양도의 잔액을 줄이고 계정으로의 전송 잔액을 늘리십시오. 전송 작업 코드는 두 가지 다른 계정 개체의 방법입니다.
예를 들어, 동일한 코드가 다른 스레드에 의해 호출되고 실행되면이 코드가 다른 스레드의 상태와 데이터는 GetContext 메소드에 의해 얻는다 getContext 메소드를 몇 번이나 호출하더라도 스레드와 모듈이 동일한 getContext 메소드에 관계없이.
실험적인 경우 : 글로벌 공유 된 스레드 로컬 변수를 정의한 다음 여러 스레드를 시작하여 threadLocal 변수에 다른 여러 메소드를 호출하십시오 , 여러 클래스가 동일한 스레드에서 동일한 데이터를 공유한다는 것을 알 수 있습니다.
외부 세계가 ThreadLocal 변수를 직접 작동시키지 않도록 ThreadLocal 변수를 캡슐화하려면.
이 응용 프로그램은 기본 유형의 데이터 포장에 대해 상대적으로 드물다.
객체 유형 데이터의 포장이 더 일반적입니다. 즉, 특정 클래스가 다른 스레드에 대한 독립 인스턴스 객체를 생성 할 수 있습니다.
com.ljq.test.thread java.util.random; 인스턴스 객체를 제공합니다. 획득 한 인스턴스 객체는 현재 캡슐화 된 객체입니다. <2; i ++ (new runnable () () {@override public void run () {int data = new random (); system.out.println (thread.currentthread (). x x. " + 데이터); 해당 메소드 정적 클래스 A {public void get () {int data = x.get (); ); /* mythreadscopedata = mythreadscopedata.get.out.println; .getage (); */ mythreadscopedata = mythreadscopedata.getThreadInstance ( "a from" + thread.cu rrentThread () getName () + "getmyData :" + mydata.getName (). "," + mydata.getage ());}} // 해당 메소드 정적 클래스 B {public void get () {int data = x .get.out.println ( "b from" + 스레드 .currenthread () getName () + " + data); getMyData : " + myData.getName () +", " + myData.getage ()); Rivate MythreadScopedata () {} // 인스턴스 메소드를 제공합니다. 동기화 된 키워드를 추가하여 스레드가 자체 데이터를 가져 오는 것을 나타냅니다. 그리고 서로를 방해하지 마십시오 현재 스레드 범위 정적 ThreadLocal <mythreadscopedata> map = private int getName () {return name;} .name = name;} public int getage () {return age;} public void setage (int age) {this.age = age;}}}