이 기사는 Java 멀티스레딩 키워드 휘발성, 잠금 및 동기화에 대한 간략한 소개를 제공합니다. 이는 특정 참고 가치가 있으므로 도움이 될 수 있습니다.
1. 휘발성의 메모리 의미
휘발성 쓰기 및 휘발성 읽기:
스레드 A는 휘발성 변수를 씁니다. 본질적으로 스레드 A는 다음으로 휘발성 변수(공유 변수)를 읽을 스레드에 메시지를 보냅니다. 수정된) 메시지입니다. 스레드 B가 휘발성 변수를 읽을 때 본질적으로 스레드 B는 이전 스레드에서 보낸 메시지(휘발성 변수를 쓰기 전에 공유 변수에 대한 수정 사항)를 받습니다. 스레드 A는 휘발성 변수를 쓴 다음 스레드 B는 휘발성 변수를 읽습니다. 이 프로세스는 본질적으로 스레드 A가 주 메모리를 통해 스레드 B에 메시지를 보내는 것입니다.
잠금 해제 및 잠금 획득의 메모리 의미:
스레드 A가 잠금을 해제하면 본질적으로 스레드 A는 다음에 잠금을 획득할 스레드에 메시지(스레드 A가 공유 변수에 적용한 수정 사항에 대한 정보)를 보냅니다. . 스레드 B는 잠금을 획득합니다. 본질적으로 스레드 B는 이전 스레드에서 보낸 메시지(잠금을 해제하기 전에 공유 변수에 대한 수정)를 받습니다. 스레드 A가 잠금을 해제한 다음 스레드 B가 잠금을 획득합니다. 이 프로세스는 본질적으로 스레드 A가 주 메모리를 통해 스레드 B에 메시지를 보내는 것입니다.
요약: 휘발성 키워드의 역할은 여러 스레드에서 변수를 표시(표시)하는 것이지만, 휘발성 키워드만으로는 스레드 안전성을 보장할 수 없습니다.
2. Lock
Lock은 인터페이스입니다.
public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); Condition newCondition(); }
lock(), tryLock(), tryLock(장시간, TimeUnit 단위) 및 lockInterruptible()을 사용하여 잠금을 얻습니다.
unLock() 메서드는 잠금을 해제하는 데 사용됩니다. tryLock() 메서드에는 잠금 획득을 시도하는 데 사용되는 반환 값이 있습니다. 획득에 성공하면(즉, 잠금이 다른 스레드에 의해 획득된 경우) true를 반환합니다. 이는 false를 반환합니다. 이는 이 메서드가 무슨 일이 있어도 즉시 반환된다는 것을 의미합니다. 자물쇠를 얻을 수 없을 때 거기에서 기다리지 않을 것입니다. tryLock(장시간, TimeUnit 단위) 메서드는 tryLock() 메서드와 유사하지만, 잠금을 얻지 못한 경우 일정 시간 동안 대기한다는 차이점이 있습니다. 제한하면 false를 반환합니다. 잠금이 처음에 획득되었거나 대기 기간 동안 획득된 경우 true를 반환합니다. lockInterruptible() 메소드는 특별합니다. 이 메소드를 통해 잠금을 획득할 때 스레드가 잠금 획득을 대기 중인 경우 스레드는 인터럽트에 응답할 수 있습니다. 즉, 스레드의 대기 상태를 인터럽트할 수 있습니다. 즉, 두 스레드가 lock.lockInterruptible()을 통해 동시에 잠금을 획득하려고 할 때 스레드 A가 이때 잠금을 획득하고 스레드 B가 기다리고만 있다면 threadB.interrupt() 메서드는 다음과 같습니다. 스레드 B에서 호출됩니다. 스레드 B의 대기 프로세스를 중단할 수 있습니다.
잠금을 획득하는 과정에서 잠금이 중단될 수 있습니다. lock은 잠금을 획득하려고 시도할 수 있습니다. 다른 스레드가 잠금을 보유하고 있으면 false를 반환하고 현재 스레드를 절전 모드로 전환하지 않습니다. 잠금이 잠금을 획득하려고 시도할 때 시간 매개변수를 전달합니다. 이 시간 범위 내에 잠금이 획득되지 않으면 요청이 종료됩니다. 동기화는 자동으로 잠금을 해제하지만, 잠금은 자동으로 잠금을 해제하지 않습니다. 참고: lock()을 사용하여 코드 조각을 잠글 수 있으므로 잠금이 해제되기 전에 다른 코드가 기다려야 합니다. 잠금은 동기화처럼 자동으로 잠금을 해제하지 않으므로 다음 위치에 배치해야 합니다. try-finally 블록을 사용하여 잠금이 해제되었는지 확인합니다.
Lock과 동기화에는 다음과 같은 차이점이 있습니다.
1) Lock은 인터페이스이고, 동기화는 Java의 키워드이고, 동기화는 내장 언어 구현입니다.
2) 동기화는 예외가 발생하면 자동으로 스레드를 해제합니다. Lock이 점유되어 있으므로 교착상태가 발생하지 않으며, Lock 예외가 발생한 경우 unLock()을 통해 적극적으로 잠금을 해제하지 않으면 교착상태가 발생할 수 있으므로 Lock을 사용할 때는 잠금을 해제해야 합니다. finally 블록. ;
3) 잠금은 잠금이 인터럽트에 응답하기를 기다리는 스레드를 허용할 수 있지만 동기화를 사용하면 대기 스레드는 영원히 기다리며 인터럽트에 응답할 수 없습니다.
4) 잠금을 통해 잠금이 성공적으로 획득되었는지 알 수 있지만 동기화할 수는 없습니다.
5) 잠금은 여러 스레드에 의한 읽기 작업의 효율성을 향상시킬 수 있습니다. 성능적인 측면에서 리소스 경쟁이 치열하지 않다면 둘의 성능은 거의 같습니다. 리소스 경쟁이 매우 치열한 경우(즉, 동시에 경쟁하는 스레드 수가 많은 경우) 잠금 성능은 동기화 성능보다 훨씬 뛰어납니다. 그러므로 사용시 상황에 맞게 선택해야 합니다. ReentrantLock은 "재진입 잠금"을 의미합니다. 재진입 잠금의 개념은 다음 섹션에서 설명됩니다. ReentrantLock은 Lock 인터페이스를 구현하는 유일한 클래스이며 ReentrantLock은 더 많은 메서드를 제공합니다.
3. 동기화됨
1. 두 개의 동시 스레드가 동일한 개체 개체의 동기화된(this) 동기화 코드 블록에 액세스하면 한 번에 하나의 스레드만 실행될 수 있습니다. 다른 스레드는 이 코드 블록을 실행하기 전에 현재 스레드가 이 코드 블록 실행을 완료할 때까지 기다려야 합니다.
2. 그러나 스레드가 객체의 동기화된(this) 동기화 코드 블록에 액세스하면 다른 스레드는 여전히 객체의 동기화되지 않은(this) 동기화 코드 블록에 액세스할 수 있습니다.
3. 특히 중요한 점은 스레드가 객체의 동기화된(this) 동기화 코드 블록에 액세스할 때 다른 스레드가 객체의 다른 모든 동기화된(this) 동기화 코드 블록에 액세스하는 것이 차단된다는 것입니다.
4. 세 번째 예는 다른 동기화 코드 블록에도 적용 가능합니다. 즉, 스레드가 객체의 동기화된(this) 동기화 코드 블록에 액세스하면 이 객체의 객체 잠금을 획득합니다. 결과적으로 개체 개체의 모든 동기화된 코드 부분에 대한 다른 스레드의 액세스가 일시적으로 차단됩니다. 동기화 키워드 범위: 객체 인스턴스 내에서 동기화된 aMethod(){}는 여러 스레드가 이 객체의 동기화된 메서드에 동시에 액세스하는 것을 방지할 수 있습니다(객체에 동기화된 메서드가 여러 개 있는 경우 하나의 스레드가 다음 중 하나에 액세스하는 한). 동기화된 메서드 메서드를 사용하면 다른 스레드가 동시에 이 개체의 동기화된 메서드에 액세스할 수 없습니다. 이때 서로 다른 객체 인스턴스의 동기화 방법은 서로 간섭하지 않습니다. 즉, 다른 스레드는 동시에 동일한 클래스의 다른 객체 인스턴스에 있는 동기화된 메서드에 액세스할 수 있습니다. 동기화된 정적 aStaticMethod{}는 여러 스레드가 이 클래스의 동기화된 정적 메서드에 액세스하는 것을 방지합니다. 동시에. 클래스의 모든 객체 인스턴스에서 작동합니다.
위 내용은 Java 멀티스레딩 키워드 휘발성, 잠금 및 동기화에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!