멀티스레딩 및 ThreadLocal에 대한 참고 사항 이해

1. 스레드와 프로세스의 차이점

프로세스는 운영 체제에 의해 직접 관리되고 직접 실행되며 자체 주소 공간을 갖는 "자체 포함" 실행 프로그램을 의미합니다. 각 프로세스는 시작될 때 메모리를 소비합니다.

스레드는 프로세스 내의 단일한 순차적 제어 흐름으로, 프로세스는 여러 스레드를 가지며, 여러 스레드는 프로세스의 내부 공간을 공유합니다.

2. 메인 스레드

메인 메소드가 실행되자마자 메인 스레드가 시작됩니다.

메인 스레드의 특징: 1. 먼저 시작, 2. 마지막으로 종료, 2. 다른 하위 스레드 생성, 4. 리소스 재활용.

3. 스레드 생성 및 시작

Thread thread=new Thread(Thread를 상속받거나 Runnable 인터페이스를 구현하는 객체) //사양이며, 스레드 생성이 완료된 후 이름을 설정해야 합니다. thread.setName("스레드 이름 설정"); //스레드를 시작하려면 start 메소드를 사용하고, 시작된 후에는 run 메소드를 실행합니다. thread.start();

4. 스레드 객체 생성

1. 상속---Thread 클래스의 하위 클래스를 선언하고 run() 메서드를 재정의합니다.

class mythread extends Thread{
    public void run(){
        /*覆盖方法*/
    }
}

2. 인터페이스 구현 ----구현 클래스 Runnable 인터페이스 클래스 선언 및 run() 메소드 구현

class mythread implements Runnable{ 
    public void run(){
        /*实现该方法*/
    } 
}

5. 스레드가 호출하는 start 메소드와 run 메소드의 차이점

1. 시작 메소드를 호출하면 스레드가 시작되고 기본 스레드 외부에서 새 하위 스레드가 시작됩니다.

2. run 메소드 호출은 일반적인 메소드 호출입니다.

6. 스레드 동시성 라이브러리

Doug Lea의 동시성 라이브러리가 패키지. 이 패키지는 스레드 실행 및 수명 주기 제어와 스레드 풀 생성을 제공합니다. , JDK5

Java는 Executors 클래스를 통해 스레드 풀을 생성하는 네 가지 정적 메서드를 제공합니다.

newCachedTreadPool 캐시 가능한 스레드 풀을 만듭니다. 스레드 풀의 길이가 처리 요구 사항을 초과하는 경우 유휴 스레드를 유연하게 재활용할 수 있습니다. 재활용이 없으면 새 스레드가 만들어진.

newFixedTreadPool(★★★★★)최대 동시 스레드 수를 제어할 수 있는 고정 길이 스레드 풀을 생성합니다. 스레드를 초과하는 스레드는 대기열에서 대기합니다.

newScheduledTreadPool 예약 및 주기적인 작업 실행을 지원하기 위해 고정 길이 스레드 풀을 만듭니다.

newSingleTreadExecutor 유일한 작업자 스레드만 사용하여 작업을 실행하는 단일 스레드 스레드 풀을 생성하여 모든 작업이 지정된 순서(FIFO, LIFO, 우선 순위)로 이루어지도록 보장합니다. ) 구현하다.

7. 스레드 풀의 역할

1. 스레드 수를 제한해도 스레드가 너무 많아서 스레드 오버플로 예외(시스템이 느리게 실행되거나 충돌함)가 발생하지 않습니다.

2. 스레드 풀을 매번 생성하고 소멸할 필요가 없어 리소스가 절약됩니다.

3. 응답 시간이 빨라지고 성능이 향상되었습니다.

참고: 연결 풀과 스레드 풀의 원리와 메커니즘은 기본적으로 동일합니다. 그들은 모두 공간을 시간과 교환하는 최적화 전략을 사용합니다.

8. 스레드 프로세스(스레드의 8가지 상태):

1. --- 새로 만들기(스레드 객체 생성)

2. ---준비(start() 호출)

3. ---실행(run() 실행)----다음 4가지 상태는 완료 후 준비 상태로 돌아갑니다.

    1. Sleep--sleep() 메서드 호출(일반적으로 사용됨)

    2. 잠깐--wait() 메서드 호출(일반적으로 사용됨)

    3. 중단--yeld() 메소드 호출(일반적으로 사용되지 않음)

    4. 차단 - IO 차단, 사용자 입력 대기(일반적으로 사용됨)

4. ---죽음(run() 실행 완료)

9. 기다림과 잠의 차이

//当前线程休眠一秒,在执行当前线程 

Thread.sleep(1000);

sleep 메소드는 스레드 클래스 Thread에 정의되어 있고 wait 메소드는 Object에 정의되어 있습니다.

대기 메서드는 동기화된 메서드나 동기화된 블록에만 배치할 수 있으며, 이는 현재 스레드가 리소스를 기다리고 있음을 나타냅니다. sleep 메서드는 현재 스레드가 절전 모드임을 나타내기 위해 어디에나 배치할 수 있습니다.

wait 메소드는 객체 잠금을 해제하지만 sleep 메소드는 객체 잠금을 해제하지 않습니다.

wait 메서드를 사용한 후 스레드는 실행을 계속하기 전에 알림을 통해 깨워야 합니다. 절전 모드가 끝나면 스레드는 자동으로 실행을 계속합니다.

10. 스레드 동기화(스레드 안전성):

1. 두 개 이상의 스레드가 동일한 리소스에 동시에 액세스하는 경우 데이터 혼동을 피하기 위해 동시에 하나의 스레드만 액세스하도록 허용합니다.

2. 동기화 키워드: 첫 번째 스레드가 실행을 완료하기 전에 두 번째 스레드는 액세스할 수 없습니다. (public 뒤, void 앞에 배치)

3. 스레드 동기화 결과: ----1. 데이터 보안 ----2. 낮은 효율성

11. 스레드 우선순위:

두 개 이상의 스레드가 준비 상태에 있으면 우선 순위가 더 높은 스레드가 CPU에 의해 먼저 실행됩니다. 우선순위에는 10단계가 있으며, 숫자가 클수록 우선순위가 높습니다. 기본값은 레벨 5입니다.

    • NORM_PRIORITY: 값은 5입니다.
    • MAX_PRIORITY: 값은 10입니다.
    • MIN_PRIORITY: 값은 1입니다.

기본 우선순위는 NORM_PRIORITY입니다.

우선순위와 관련하여 두 가지 방법이 있습니다.

    • final void setPriority(int newp): 스레드의 현재 우선순위를 수정합니다.
    • final int getPriority(): 스레드의 우선순위를 반환합니다.

12. 교착상태

두 스레드가 루프의 동기화 개체에 의존할 때 교착 상태가 발생합니다.

예를 들어 한 스레드는 개체 ObjA의 모니터에 들어가고 다른 스레드는 개체 ObjB의 모니터에 들어갑니다. ObjA의 스레드가 ObjB의 동기화된 메서드를 호출하려고 하면 교착 상태가 발생합니다.

교착 상태는 거의 발생하지 않지만 발생하면 디버깅하기가 어렵습니다.

13. ThreadLocal(지역화된 스레드)

1. 정의

① ThreadLocal은 스레드가 아니라 스레드의 지역화된 객체입니다.

② 스레드에서 작동하는 객체가 ThreadLocal을 사용하여 변수를 유지하는 경우 해당 변수를 사용하는 각 스레드에 변수의 독립적인 복사본을 할당합니다.

③ 스레드 복사본을 메모리에 복사하여 시간과 공간을 교환합니다.

2. 제한사항

복사할 수 없는 유일한 변수는 동기적으로만 잠글 수 있습니다.

3. 인터페이스 방법

①.void set(Object value); 현재 스레드의 지역 변수를 설정합니다.

② Object get(); 현재 스레드의 지역 변수를 가져옵니다.

4. 구현 메커니즘

맨 아래 레이어는 Map 컬렉션을 통해 각 스레드 변수의 복사본을 저장합니다. Map의 Key는 스레드 개체(스레드 ID)에 해당하고 값은 스레드의 변수 복사본에 해당합니다.

5. 스레드 동기화 메커니즘과 비교

동기화 메커니즘에서는 여러 스레드가 동시에 변수에 액세스할 수 없으며 액세스를 위해 순서대로만 대기열에 들어갈 수 있습니다. 멀티 스레드 액세스를 처리할 때 스레드 동기화 메커니즘은 시간을 공간으로 교환하고 액세스 직렬화 및 객체 공유라는 견고한 아이디어를 채택합니다.

ThreadLocal: 각 스레드에 대해 독립적인 변수 복사본을 생성하여 비동기 구현을 달성하고 데이터 유효성을 보장할 수 있습니다. 공간을 시간 교환, 액세스 병렬화 및 개체 독점성이라는 구현 아이디어를 채택합니다.

 

Guess you like

Origin blog.csdn.net/qq_42080073/article/details/102996000