>Java >java지도 시간 >Java의 멀티스레드 공유 변수 및 협업 메커니즘

Java의 멀티스레드 공유 변수 및 협업 메커니즘

WBOY
WBOY앞으로
2023-04-20 15:55:202128검색

    1. 프로세스 및 스레드

    1. 프로세스는 프로그램을 실행하는 데 필요한 리소스 할당의 최소 단위입니다.

    프로세스는 다음을 포함하여 운영 체제에 의한 리소스 할당의 최소 단위입니다. CPU, 메모리 공간, 디스크 IO 등 동일한 프로세스의 여러 스레드는 프로세스의 모든 시스템 리소스를 공유하며 프로세스는 서로 직접적으로 독립적입니다. 프로세스는 특정 데이터 세트에 대해 실행 활동을 수행하는 특정 독립 기능을 갖춘 프로그램입니다. 프로세스는 시스템의 자원 할당 및 스케줄링을 위한 독립적인 단위입니다.

    프로세스는 컴퓨터에서 프로그램을 실행하는 활동입니다. 프로그램을 실행하면 프로세스가 시작됩니다. 분명히 프로그램은 죽었고 정적인 반면, 프로세스는 활동적이고 동적입니다. 프로세스는 시스템 프로세스와 사용자 프로세스로 나눌 수 있습니다. 운영 체제의 다양한 기능을 완료하는 데 사용되는 모든 프로세스는 실행 중인 운영 체제 자체입니다. 사용자 프로세스는 모두 사용자가 시작한 프로세스입니다.

    2. 스레드는 CPU 스케줄링의 가장 작은 단위이며 존재하는 프로세스에 의존해야 합니다.

    스레드는 프로세스의 개체이며 CPU 스케줄링 및 디스패치의 기본 단위입니다. 기본 유닛을 독립적으로 실행합니다. 스레드 자체는 기본적으로 시스템 리소스를 소유하지 않으며 실행에 필수적인 몇 가지 리소스(예: 프로그램 카운터, 레지스터 집합, 스택)만 소유하지만 프로세스가 소유한 모든 리소스를 다른 스레드와 공유할 수 있습니다. 같은 과정에서.

    3. 스레드는 어디에나 있습니다.

    모든 프로그램은 스레드를 만들어야 합니다. 특히 Java모든 프로그램은 main기능의 메인 스레드를 시작해야 합니다. , 비동기 메시지 처리 메커니즘, 원격 액세스 인터페이스 RM 등 모든 청취 이벤트, onClick 트리거 이벤트 등은 스레드 및 동시성에 대한 지식과 분리될 수 없습니다. 2. CPU 코어 수와 스레드 수의 관계1. 멀티 코어

    멀티 코어

    : 단일 칩 멀티프로세서(

    Chip Multiprocessors, CMP

    라고도 함)를 의미하기도 합니다. ,

    CMP는 미국 스탠포드 대학에서 개발되었습니다. 대규모 병렬 프로세서의 SMP(대칭 프로세서)를 동일한 칩에 통합하고 각 프로세서가 서로 다른 프로세스를 병렬로 실행한다는 아이디어입니다. 여러 개의 CPU에 의존하여 동시에 병렬로 실행되는 이런 종류의 프로그램은 병렬 처리라고 불리는 초고속 컴퓨팅을 구현하는 중요한 방향입니다. 2. 멀티스레딩멀티스레딩

    :

    동시 멀티스레딩. 줄여서 SMT.

    을 사용하면 동일한 프로세서의 여러 스레드가 동시에 실행되고 프로세서의 실행 리소스를 공유할 수 있습니다.

    3. 코어 및 스레드 수코어 및 스레드 수

    : 현재 주류인

    CPU

    는 모두 멀티 코어입니다. 코어 수를 늘리는 것은 스레드 수를 늘리는 것입니다. 운영체제는 스레드를 통해 작업을 수행하기 때문입니다. 일반적으로

    1:1 대응을 하므로 쿼드 코어 CPU에는 일반적으로 4개의 스레드가 있습니다. 하지만 인텔이 하이퍼스레딩 기술을 도입한 이후 코어 수와 스레드 수는 1:2 관계를 형성했습니다. 3. CPU 타임 슬라이스 회전 메커니즘

    우리는 일반적으로 개발할 때 단일 코어 CPU에서도 원할 때마다 CPU 코어 수에 제한을 받지 않는다고 느낍니다. 왜? 이는 운영 체제가 CPU 타임 슬라이스 회전 메커니즘을 제공하기 때문입니다. Java의 멀티스레드 공유 변수 및 협업 메커니즘

    타임 슬라이스 회전 스케줄링은 RR 스케줄링이라고도 알려진 가장 오래되고 단순하며 공정하고 가장 널리 사용되는 알고리즘 중 하나입니다. 각 프로세스에는 프로세스가 실행되는 시간인 시간 조각이라고 하는 기간이 할당됩니다.

    4. 병렬성과 동시성

    A고속도로가 4차선이라면 최대

    병렬

    차량은 4대입니다. 이 고속도로에서 동시에 나란히 걷는 차량의 수는 입니다. 4 이하인 경우 차량은 병렬로 주행할 수 있습니다.

    CPU

    도 이 원칙에 기초합니다. 하나의

    CPU는 고속도로와 동일하며, 코어 또는 스레드의 수는 나란히 지나갈 수 있는 차량의 수와 동일하며, 여러 개의 CPU는 여러 대와 같습니다. 고속도로 및 각 고속도로 고속도로에는 여러 차선이 나란히 있습니다. 동시성에 관해 이야기할 때 단위 시간을 꼭 추가하세요. 즉, 단위 시간당 동시성의 양은 얼마인가요? 실제로 단위 시간을 벗어나는 것은 의미가 없습니다.

    두 가지 일을 동시에 할 수 없다는 속담이 있듯이, 이는 원칙적으로 컴퓨터에서도 마찬가지입니다. 이 프로세스를 실행하려면 하나의

    CPU가 하나의 프로세스에만 할당될 수 있습니다. 우리가 일반적으로 사용하는 컴퓨터에는 CPU

    가 하나만 있습니다. 즉, 다중 작업을 동시에 수행하고 여러 프로세스를 실행할 수 있으려면 동시성 기술을 사용해야 합니다. 동시성 기술을 구현하는 것은 매우 복잡하며 가장 이해하기 쉬운 것은 "타임 슬라이스 회전 프로세스 스케줄링 알고리즘"입니다.

    1. 동시성

    并发:은 애플리케이션이 서로 다른 작업을 교대로 실행할 수 있음을 의미합니다. 예를 들어 단일 CPU 코어에서 여러 스레드를 실행한다고 해서 두 개의 스레드를 동시에 실행하는 것은 아닙니다. 우리는 "동시 실행" 효과를 달성하기 위해 이 두 작업 실행 사이를 끊임없이 전환하지만 컴퓨터의 실행 속도는 우리가 알아차리기에는 너무 빠릅니다.

    2. 병렬

    병렬: 다른 작업을 동시에 수행할 수 있는 기능을 의미합니다. 예를 들어 식사하는 동안 TV를 시청할 수 있습니다.

    ** 동시성과 병렬성의 차이점은 다음과 같습니다. 하나는 대체 실행이고 다른 하나는 동시 실행**

    Java의 멀티스레드 공유 변수 및 협업 메커니즘

    5. 높은 동시 프로그래밍

    멀티 코어 CPU의 탄생으로 인해, 멀티스레딩, 높은 동시성 프로그래밍이 점점 더 많은 관심과 주목을 받고 있습니다.

    1. CPU 리소스의 전체 활용

    위의 CPU 소개에서 멀티스레드 동시성 메커니즘을 사용하지 않는 CPU 커널이 없다는 것을 알 수 있습니다. 특히 서버가 하나 이상의 CPU. 프로그램의 기본 스케줄링 단위는 스레드입니다. 스레드는 CPU의 한 코어 중 하나의 스레드에서만 실행될 수 있습니다. i3 CPU가 있는 경우 최악의 경우 듀얼 코어와 4개 스레드의 컴퓨팅 성능을 갖추는 것입니다. 스레드라면 CPU 성능의 3/4가 낭비됩니다. 멀티 스레드를 설계하면 여러 CPU의 여러 코어로 이루어진 여러 스레드에서 동시에 실행될 수 있으므로 CPU를 최대한 활용하고 비용을 줄일 수 있습니다. CPU의 유휴 시간을 줄여 컴퓨팅 성능을 발휘하고 동시성을 높입니다.

    2. 사용자 응답 시간 단축

    예를 들어, 우리가 자주 사용하는 다운로드 기능은 멤버십 버전을 사용하면 여러 스레드를 다운로드할 수 있기 때문에 아무도 하나의 스레드에서 다운로드할 수 없기 때문에 많은 친구들이 특정 멤버십을 개설하게 됩니다. , 왜? 멀티 스레드 다운로드가 빠르기 때문입니다.

    프로그램 개발을 할 때 웹 페이지 속도가 1초씩 빨라지면 사용자 수가 많아지면 전환 횟수도 늘어날 수 있습니다. 우리가 자주 탐색하는 웹 페이지에서 브라우저가 페이지를 로드할 때 몇 개의 스레드를 더 열어 네트워크 리소스를 로드하여 웹 사이트의 해당 속도를 향상시킵니다. 멀티스레딩과 높은 동시성은 컴퓨터 어디에나 있습니다.

    3 코드를 모듈식, 비동기식, 단순하게 만드세요

    예를 들어, 전자 상거래 프로젝트를 수행하는 경우 주문을 하고 사용자에게 문자 메시지와 이메일을 보내는 것은 문자 메시지와 이메일의 두 부분으로 나눌 수 있습니다. . 단계는 두 개의 개별 모듈로 분리되어 실행을 위해 다른 스레드로 전달됩니다. 이는 비동기 작업을 증가시키고 시스템 성능을 향상시킬 뿐만 아니라 프로그램을 모듈식으로 명확하고 단순하게 만듭니다.

    6. 멀티 스레딩 시 주의 사항

    1. 스레드 간 보안

    동일 프로세스의 여러 스레드는 리소스를 공유합니다. 즉, 모두 동일한 메모리 주소의 변수에 액세스할 수 있습니다.

    예: 각 스레드에 전역 변수와 정적 변수에 대한 읽기 작업만 있고 쓰기 작업은 없는 경우 일반적으로 이 전역 변수는 여러 스레드가 동시에 쓰기 작업을 수행하는 경우 스레드로부터 안전합니다. 일반적으로 필요합니다. 스레드 동기화를 고려하십시오. 그렇지 않으면 스레드 안전성이 영향을 받을 수 있습니다.

    2. 스레드 간 교착 상태

    스레드 간 보안 문제를 해결하기 위해 Java 잠금 메커니즘이 도입되었습니다. 그러나 주의하지 않으면 스레드가 서로 다르기 때문에 Java 스레드 교착 상태라는 멀티 스레딩 문제가 발생합니다. 전혀 해제할 수 없는 잠금을 기다리고 있어 모든 작업이 완료되지 않습니다.

    배고픈 두 사람이 있다고 가정해 보세요. 그들은 나이프와 포크를 공유하고 번갈아 가며 먹어야 합니다. 두 사람 모두 자물쇠 두 개를 얻어 나이프와 포크를 공유해야 합니다. 스레드 A가 나이프를 가져오고 스레드 B가 포크를 가져간다고 가정합니다. 스레드 A는 포크를 기다리기 위해 차단 상태에 들어가고 스레드 B는 스레드 A가 소유한 나이프를 기다립니다. 이는 단지 인위적인 예일 뿐이며 런타임에 감지하기는 어렵지만 이런 상황은 항상 발생합니다.

    3. 스레드가 너무 많으면 서비스 리소스가 소모되고 충돌이 발생합니다.

    스레드가 너무 많으면 시스템에서 많은 수의 스레드가 생성되어 시스템 메모리와 CPU의 "전환 전환"이 발생할 수 있습니다. 시스템이 다운되는데, 이런 문제를 어떻게 해결해야 할까요?

    파일 설명 등 일부 시스템 리소스가 제한되어 있습니다. 다중 스레드 프로그램은 각 스레드가 하나의 리소스를 원할 수 있으므로 리소스가 부족할 수 있습니다. 스레드 수가 상당히 크거나 리소스에 대한 후보 스레드 수가 사용 가능한 리소스 수를 훨씬 초과하는 경우 리소스 풀을 사용하는 것이 가장 좋습니다. 가장 좋은 예 중 하나는 데이터베이스 연결 풀링입니다. 스레드가 데이터베이스 연결을 사용해야 할 때마다 풀에서 하나를 가져와 사용 후 풀로 반환합니다. 리소스 풀은 리소스 라이브러리라고도 합니다.

    멀티 스레드 애플리케이션을 개발할 때 주의해야 할 사항이 많습니다. 앞으로의 작업에서는 모두가 천천히 그 위험성을 이해할 수 있기를 바랍니다.

    7. 멀티스레딩에 대한 참고 사항

    스레드는 서로 협력하여 특정 작업을 완료합니다. 예를 들어 한 스레드가 개체의 값을 수정하고 다른 스레드가 변경 사항을 감지한 다음 해당 작업을 수행합니다. 스레드를 사용하고 최종 실행은 다른 스레드입니다. 전자는 생산자이고 후자는 소비자입니다. 이 모델은 "무엇"과 "어떻게"를 분리하여 변수가 기대치를 충족하는지 확인하기 위해 소비자 스레드를 계속 반복하는 동시에 루프에 만족되지 않는 조건을 설정합니다. . 조건이 충족되면 while 루프를 종료하여 소비자의 작업을 완료합니다.

    그러나 다음과 같은 문제가 있습니다.

    • 적시성을 보장하기 어렵습니다.

    • 비용 절감이 어렵습니다. 슬립 시간을 1밀리초 정도로 줄이면 소비자는 상태 변화를 더 빨리 감지할 수 있지만 프로세서 리소스를 더 많이 소모해 불필요한 낭비가 발생할 수 있다.

    대기/알림 메커니즘: 한 스레드 A가 객체 O의 wait() 메서드를 호출하고 대기 상태에 들어가는 반면, 다른 스레드 B는 객체 O의 inform() 또는 informAll() 메서드를 호출하는 것을 의미합니다. A 알림을 받은 후 객체 O의 wait() 메서드에서 반환되어 후속 작업을 수행합니다. 위의 두 스레드는 객체 O를 통해 상호 작용을 완료하며 객체에 대한 wait()와 inform/notifyAll()의 관계는 대기 측과 알림 측 간의 상호 작용을 완료하는 데 사용되는 스위치 신호와 같습니다.

    notify(): wait 메서드에서 개체가 반환되기를 기다리는 스레드에 알립니다. 반환의 전제는 스레드가 개체의 잠금을 획득하고 잠금을 획득하지 못한 스레드가 WAITING 상태에 다시 들어가는 것입니다. .

    notifyAll(): 객체에서 대기 중인 모든 스레드에 알림

    wait(): 이 메서드를 호출하는 스레드는 WAITING 상태로 들어가고 다른 스레드의 알림을 기다리거나 중단된 경우에만 반환됩니다. wait() 메소드를 호출한 후 객체의 잠금이 해제됩니다.

    wait(long): 시간 초과 및 일정 시간 동안 대기합니다. 여기서 매개변수 시간은 밀리초입니다. 즉, 알림이 없으면 시간 초과되어 반환됩니다.

    wait(long, int): 시간 초과를 보다 세밀하게 제어하기 위해 나노초를 달성할 수 있습니다.

    대기 및 알림의 표준 패러다임은 다음 원칙을 따릅니다.

    • 객체의 잠금을 가져옵니다.

    • 조건이 충족되지 않으면 객체의 wait() 메서드를 호출하고 알림을 받은 후 조건을 확인합니다.

    • 조건이 충족되면 해당 로직이 실행됩니다.

    Java의 멀티스레드 공유 변수 및 협업 메커니즘

    알림자는 다음 원칙을 따릅니다.

    • 개체의 잠금을 얻습니다.

    • 조건을 변경하세요.

    • 객체를 대기 중인 모든 스레드에 알립니다.

    Java의 멀티스레드 공유 변수 및 협업 메커니즘

    wait() 및 inform() 시리즈 메서드를 호출하기 전에 스레드는 개체의 개체 수준 잠금을 획득해야 합니다. 즉, wait() 메서드 및 inform()은 다음에서만 호출할 수 있습니다. 동기화된 메소드 또는 동기화된 블록 일련의 메소드, wait() 메소드를 입력한 후 현재 스레드는 wait()에서 리턴되기 전에 스레드가 알림을 실행하는 경우 다른 스레드와 경쟁합니다. () 일련의 메소드는 informAll을 호출하는 동기화된 코드 블록을 종료한 후 경쟁하게 됩니다. 스레드 중 하나가 객체 잠금을 획득하면 계속 실행됩니다. 동기화된 코드 블록을 종료하고 잠금을 해제한 후 깨어난 다른 스레드는 계속해서 잠금을 획득하기 위해 경쟁하며 모든 깨어난 스레드가 실행될 때까지 계속됩니다. 실행을 완료했습니다.

    notify 및 informAll을 사용해야 하는 사람

    notifyAll()을 최대한 많이 사용하고, inform()을 주의해서 사용하세요. 우리가 깨어나는 데 필요한 실이 되어주세요.

    위 내용은 Java의 멀티스레드 공유 변수 및 협업 메커니즘의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제