Java java지도 시간 Java 멀티스레딩 키워드 휘발성, 잠금 및 동기화에 대한 간략한 소개

Java 멀티스레딩 키워드 휘발성, 잠금 및 동기화에 대한 간략한 소개

Sep 25, 2018 pm 03:36 PM
자바 멀티스레딩

이 기사는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Java의 휘발성 키워드의 사용 시나리오 및 기능에 대한 자세한 설명 Java의 휘발성 키워드의 사용 시나리오 및 기능에 대한 자세한 설명 Jan 30, 2024 am 10:01 AM

Java에서 휘발성 키워드의 역할과 응용 시나리오에 대한 자세한 설명 1. 휘발성 키워드의 역할 Java에서 휘발성 키워드는 여러 스레드 간에 표시되는 변수를 식별하는 데, 즉 가시성을 보장하는 데 사용됩니다. 특히, 변수가 휘발성으로 선언되면 변수에 대한 모든 수정 사항이 즉시 다른 스레드에 알려집니다. 2. 휘발성 키워드의 적용 시나리오 상태 플래그 휘발성 키워드는 다음과 같은 일부 상태 플래그 시나리오에 적합합니다.

파일 읽기 멀티 스레드 가속 성능을 위한 Java 개발 최적화 방법 파일 읽기 멀티 스레드 가속 성능을 위한 Java 개발 최적화 방법 Jun 30, 2023 pm 10:54 PM

Java 개발에서 파일 읽기는 매우 일반적이고 중요한 작업입니다. 비즈니스가 성장함에 따라 파일 크기와 수도 늘어납니다. 파일 읽기 속도를 높이기 위해 멀티스레딩을 사용하여 파일을 병렬로 읽을 수 있습니다. 이 기사에서는 Java 개발에서 파일 읽기 다중 스레드 가속 성능을 최적화하는 방법을 소개합니다. 먼저, 파일을 읽기 전에 파일의 크기와 양을 결정해야 합니다. 파일의 크기와 개수에 따라 스레드 개수를 합리적으로 설정할 수 있습니다. 스레드 수가 너무 많으면 리소스가 낭비될 수 있습니다.

Java 다중 스레드 환경의 예외 처리 Java 다중 스레드 환경의 예외 처리 May 01, 2024 pm 06:45 PM

다중 스레드 환경에서 예외 처리의 핵심 사항: 예외 잡기: 각 스레드는 예외를 잡기 위해 try-catch 블록을 사용합니다. 예외 처리: 오류 정보를 인쇄하거나 catch 블록에서 오류 처리 논리를 수행합니다. 스레드 종료: 복구가 불가능한 경우 Thread.stop()을 호출하여 스레드를 종료합니다. UncaughtExceptionHandler: 포착되지 않은 예외를 처리하려면 이 인터페이스를 구현하고 스레드에 할당해야 합니다. 실제 사례: 포착되지 않은 예외를 처리하기 위해 UncaughtExceptionHandler를 사용하여 스레드 풀에서 예외 처리.

Java 멀티스레딩의 작동 원리와 특성을 살펴봅니다. Java 멀티스레딩의 작동 원리와 특성을 살펴봅니다. Feb 21, 2024 pm 03:39 PM

Java 멀티스레딩의 작동 원리와 특성을 살펴보세요. 소개: 현대 컴퓨터 시스템에서 멀티스레딩은 동시 처리의 일반적인 방법이 되었습니다. 강력한 프로그래밍 언어인 Java는 풍부한 멀티스레딩 메커니즘을 제공하여 프로그래머가 컴퓨터의 멀티코어 프로세서를 더 잘 활용하고 프로그램 실행 효율성을 향상시킬 수 있도록 해줍니다. 이 기사에서는 Java 멀티스레딩의 작동 원리와 특성을 살펴보고 특정 코드 예제를 통해 이를 설명합니다. 1. 멀티스레딩의 기본 개념 멀티스레딩은 하나의 프로그램 내에서 여러 개의 스레드를 동시에 실행하는 것을 말하며, 각 스레드는 서로 다른 처리를 수행합니다.

Java 멀티스레딩 성능 최적화 가이드 Java 멀티스레딩 성능 최적화 가이드 Apr 11, 2024 am 11:36 AM

Java 멀티스레딩 성능 최적화 가이드는 5가지 주요 최적화 지점을 제공합니다. 스레드 생성 및 소멸 오버헤드 감소 부적절한 잠금 경합 방지 비차단 데이터 구조 사용 사전 발생 관계 활용 잠금 없는 병렬 알고리즘 고려

Java 멀티스레드 디버깅 기술 공개 Java 멀티스레드 디버깅 기술 공개 Apr 12, 2024 am 08:15 AM

멀티스레드 디버깅 기술의 답변은 다음과 같습니다. 1. 멀티스레드 코드 디버깅의 과제: 스레드 간의 상호 작용으로 인해 동작이 복잡하고 추적하기 어렵습니다. 2. Java 다중 스레드 디버깅 기술: 라인별 디버깅 스레드 덤프(jstack)는 시작 및 종료 이벤트 스레드 로컬 변수를 모니터링합니다. 3. 실제 사례: 스레드 덤프를 사용하여 교착 상태를 찾고, 모니터 이벤트를 사용하여 교착 상태의 원인을 확인합니다. 4. 결론: Java에서 제공하는 멀티 스레드 디버깅 기술은 스레드 안전성, 교착 상태 및 경합과 관련된 문제를 효과적으로 해결할 수 있습니다.

Java의 다중 스레드 안전 문제 - java.lang.ThreadDeath에 대한 솔루션 Java의 다중 스레드 안전 문제 - java.lang.ThreadDeath에 대한 솔루션 Jun 25, 2023 am 11:22 AM

Java는 현대 소프트웨어 개발에 널리 사용되는 프로그래밍 언어이며, 멀티스레드 프로그래밍 기능도 Java의 가장 큰 장점 중 하나입니다. 그러나 멀티스레딩으로 인한 동시 접속 문제로 인해 자바에서는 멀티스레드 안전성 문제가 자주 발생한다. 그 중 java.lang.ThreadDeath는 대표적인 멀티스레드 보안 문제입니다. 이 기사에서는 java.lang.ThreadDeath의 원인과 해결 방법을 소개합니다. 1. java.lang.ThreadDeath의 이유

Java 다중 스레드 동시성 잠금에 대한 자세한 설명 Java 다중 스레드 동시성 잠금에 대한 자세한 설명 Apr 11, 2024 pm 04:21 PM

Java 동시성 잠금 메커니즘은 다중 스레드 환경에서 하나의 스레드만 공유 리소스에 액세스하도록 보장합니다. 그 유형에는 비관적 잠금(잠금을 획득한 후 액세스)과 낙관적 잠금(액세스 후 충돌 확인)이 포함됩니다. Java는 ReentrantLock(뮤텍스 잠금), Semaphore(세마포) 및 ReadWriteLock(읽기-쓰기 잠금)과 같은 내장 동시성 잠금 클래스를 제공합니다. 이러한 잠금을 사용하면 여러 스레드가 동시에 공유 변수 카운터에 액세스할 때 단 하나의 스레드만 해당 값을 업데이트하는 등 공유 리소스에 대한 스레드로부터 안전한 액세스를 보장할 수 있습니다.

See all articles