컴퓨터에 CPU가 하나만 있고 한 번에 하나의 프로그램만 처리할 수 있었던 시절을 생각해 보세요. 그러다가 멀티태스킹이 등장했는데, 이는 컴퓨터가 동시에 여러 프로그램을 처리할 수 있다는 것을 의미했습니다. 실제로 "동시에"는 아니지만. 단일 CPU는 프로그램 간에 공유됩니다. 운영 체제는 실행 중인 프로그램 사이를 전환하며, 전환하기 전에 잠시 동안 그 중 하나를 실행합니다.
멀티태스킹의 등장으로 소프트웨어 개발자에게는 새로운 도전이 되고 있습니다. 프로그램은 모든 CPU를 항상 사용할 수 있거나 모든 메모리 및 기타 컴퓨터 리소스를 사용할 수 있다고 가정할 수 없습니다. 좋은 프로그램은 다른 프로그램이 사용할 수 있도록 더 이상 사용하지 않는 모든 리소스를 해제해야 합니다.
나중에 멀티스레딩이 등장했는데, 이는 동일한 프로그램에서 여러 스레드를 실행할 수 있다는 의미입니다. 스레드는 프로그램을 실행하는 CPU로 생각할 수 있습니다. 동일한 프로그램에서 여러 스레드를 실행하는 것은 동일한 프로그램을 실행하는 여러 CPU를 갖는 것과 같습니다.
여러 스레드는 일부 프로그램 유형의 성능을 높이는 좋은 방법이 될 수 있습니다. 그러나 멀티스레딩은 멀티태스킹보다 훨씬 더 어렵습니다. 이 스레드는 동일한 프로그램에서 실행되며 동시에 동일한 메모리를 읽고 씁니다. 이로 인해 단일 스레드에서는 볼 수 없는 오류가 발생할 수 있습니다. 두 스레드가 동시에 실행되지 않기 때문에 이러한 오류 중 일부는 단일 CPU 시스템에서는 표시되지 않을 수 있습니다. 최신 컴퓨터에는 모두 멀티 코어 CPU가 있으며 심지어 여러 유형의 CPU도 있습니다. 이는 별도의 스레드가 별도의 코어 또는 CPU에 의해 동시에 실행될 수 있음을 의미합니다.
한 스레드가 메모리 유닛을 읽고 다른 스레드가 여기에 쓴다면 첫 번째 스레드는 어떤 값을 읽게 될까요? 이 오래된 것이 그만한 가치가 있나요? 아니면 두 번째 스레드에서 쓴 값인가요? 아니면 둘 사이의 하이브리드 가치입니까? 또는 두 스레드가 동시에 동일한 메모리 위치에 쓰는 경우 완료되면 어떤 값이 남을까요? 첫 번째 스레드에서 쓴 값? 두 번째 스레드를 통해 값이 기록됩니까? 아니면 혼합된 값인가요?
적절한 보호 장치가 없으면 이러한 결과는 모두 가능합니다. 이 동작은 예측할 수도 없습니다. 이 출력은 언제든지 변경될 수 있습니다. 따라서 개발자로서 올바른 보호 장치를 사용하는 방법을 아는 것이 중요합니다. 이는 스레드가 메모리, 파일, 데이터베이스 등과 같은 공유 리소스에 액세스하는 방법을 제어하는 방법을 배우는 것을 의미합니다. 이것이 이 Java 동시성 튜토리얼의 주제 중 하나입니다.
Java의 멀티스레딩 및 동시성
Java는 개발자가 멀티스레딩을 간단하고 사용하기 쉽게 만든 최초의 언어입니다. Java에는 처음부터 멀티스레딩 기능이 있었습니다. 따라서 Java 개발자는 위에서 설명한 문제에 자주 직면하게 됩니다. 이것이 내가 Java 동시성에 관한 일련의 기사를 쓴 이유입니다. 나와 마찬가지로 동료 Java 개발자라면 누구나 이 혜택을 누릴 수 있을 것입니다.
이 시리즈는 주로 Java 멀티스레딩에 대해 다루지만 멀티스레딩에서 발생하는 문제 중 일부는 멀티태스킹 및 분산 시스템에서 발생하는 문제와 유사합니다. 멀티태스킹 및 분산 시스템도 이 시리즈에서 언급될 수 있습니다. 따라서 "동시성"이라는 단어는 단지 멀티스레딩에 관한 것이 아닙니다.
2015년 이후의 Java 동시성
최초의 Java 동시성 책이 집필된 이래로 Java 동시성 프레임워크와 디자인의 세계에는 수많은 Java 5 동시성 도구가 출시된 이후에도 이러한 일이 발생했습니다.
Vert.x, Play/Akka 및 Qbit와 같은 새로운 비동기식 "아무것도 공유하지 않는" 플랫폼과 API가 등장했습니다. 이러한 플랫폼은 스레드, 공유 메모리 및 잠금의 표준 Java 동시성 모델과 비교하여 다른 동시성 모델을 사용합니다. 새로운 비차단 동시성 알고리즘이 출시되었으며 LMAX Disrupter와 같은 새로운 비차단 동시성 도구가 툴킷에 추가되었습니다.
이러한 새로운 개발로 인해 Java 동시성 튜토리얼도 업데이트해야 할 때입니다. 따라서 이 튜토리얼은 다시 한번 개정 중입니다. 새로운 튜토리얼은 작성할 시간이 있을 때마다 공개될 예정입니다.
위 내용은 1. Java 동시성/멀티스레딩에 대한 소개입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(m.sbmmt.com)를 참고해주세요!