요즘 세상은 모든 것이 빠르게 발전하고 있습니다. 모든 것에는 항상 개선의 여지가 있습니다. 프로그래밍 언어의 경우도 마찬가지입니다. 오늘날 우리는 현대 기술을 통해 모든 일을 쉽고 빠르게 처리할 수 있기를 기대합니다. 여러 가지 작업을 동시에 수행하기 위해 동시성이라는 개념이 생겼습니다. 그렇다면 동시성이란 무엇이고, 그 용도는 무엇이며, 이것이 필요한 이유 등은 무엇일까요? 우리는 이 기사에서 그러한 질문을 다루고 개별적으로 답변하려고 노력할 것입니다. 따라서 우리의 논의를 매우 기본적인 공통 섹션인 동시성의 정의로 가져가겠습니다. 이번 주제에서는 Java에서 동시성이 무엇인지 알아보겠습니다.
무료 소프트웨어 개발 과정 시작
웹 개발, 프로그래밍 언어, 소프트웨어 테스팅 등
그럼 동시성은 실제로 무엇인가요? 글쎄, 이에 답하기 위해 일반적인 시나리오를 생각해 보겠습니다. 이 기사를 읽는 동안 여러 가지 일을 동시에 수행하려고 한다고 가정해 보겠습니다. 어쩌면 당신은 메모를 하려고 할 수도 있고, 그것을 이해하려고 노력하거나 어떤 것을 생각하려고 할 수도 있습니다. 간단히 말해서 여러 작업을 동시에 수행하려고 하는 것입니다. 이것이 동시성의 의미입니다. 동시성은 단순히 여러 작업을 서로 병렬로 실행하는 것입니다. 이 글에서는 프로그래밍 언어인 Java의 범위에서 동시성에 대해 논의하겠습니다.
그럼 스레드에 대한 기본 정의를 알아보겠습니다. 실제로 Java나 일반 프로그래밍 언어에서는 동시성을 담당하는 스레드입니다. 이러한 스레드의 기본 역할은 작업의 병렬 실행을 촉진하는 것입니다.
스레드는 자체 호출 스택이 있는 경량 프로세스입니다. 그러나 스레드는 동일한 프로세스에서 실행되는 다른 스레드의 공유 데이터에 액세스할 수 있습니다. Java 애플리케이션 내에서 많은 스레드를 사용하여 병렬 처리 또는 동시성을 달성할 수 있습니다.
이제 다음 주제로 넘어가겠습니다.
따라서 모든 OOP 언어에는 Java 또는 C#과 같은 다른 프로그래밍 언어의 스레딩 개념이 있습니다. Java에는 동시성을 달성하기 위해 서로 다른 스레드를 만들어 실행하는 다양한 프로세스가 있습니다.
이러한 간단한 정의를 마친 후 다음과 같은 새로운 주제에 대해 논의해 보겠습니다.
Java 애플리케이션을 동시 실행하는 데 필요한 첫 번째 클래스는 java.lang.Thread 클래스입니다. Java.lang.Thread 클래스는 Java 프로그래밍 언어의 모든 동시성 개념을 담당합니다. 그 다음에는 스레드 클래스에서 스레드 동작을 추상화하는 java.lang.Runnable 인터페이스가 있습니다.
고급 애플리케이션을 구축하는 데 필요한 다른 클래스는 Java 1.5에 추가된 java.util.concurrent 패키지에서 사용됩니다.
이제 우리는 새로운 질문에 도달했습니다.
Java에서 동시성을 구현하는 것은 매우 간단한 것 같습니다. 그러나 실제로는 그렇지 않습니다. 살펴보겠습니다.
위의 논의는 일반적으로 동시성이 간단하고 좋은 개념이며 구현하기 매우 쉽다는 인상을 줍니다. 글쎄요, 우리가 그것을 더 잘 모니터링하고 이해하려고 노력한다고 가정해 보겠습니다. 그런 경우에는 기본 개념에 대한 올바른 이해와 우리가 달성해야 할 목표에 대한 철저한 이해가 필요합니다.
동시 애플리케이션과 단일 스레드 애플리케이션을 비교해 보겠습니다. 우리는 일반적으로 동시 적용이 디자인과 이해 측면에서 복잡하다는 것을 알고 있습니다. 여러 스레드에 의해 실행되는 코드에는 공유 데이터에 액세스하기 위한 특별한 주의와 리소스가 필요합니다. 잘못된 스레드 동기화로 인해 발생하는 오류는 디버그하고 수정하기 어렵습니다. 또한 대부분의 시나리오에서 이러한 버그는 초기 단계에서 식별되지 않습니다. prod 모드에서 감지되므로 재현하기가 더욱 어렵습니다.
버그 및 일반적인 결함 외에도 동시 스레드에는 애플리케이션을 실행하는 데 더 많은 리소스가 필요합니다.
그래서 기본적으로 동시성으로 인해 할당되는 문제에는 두 가지 유형이 있습니다. 이러한 문제는 크게 두 가지 범주로 분류할 수 있습니다
하나하나 이해해 볼까요
간단한 예를 들어 이해해 보겠습니다.
카운터나 숫자 개수를 늘리는 것이 기본 역할인 카운터 함수가 있다고 가정해 보겠습니다. 스레드 A와 스레드 B가 있고 스레드 A가 초기 값을 0으로 읽는다고 가정합니다. 이제 다음 단계가 순차적으로 실행됩니다.
여기서 문제가 발생합니다. A, B 두 스레드가 코드를 두 번 실행하는데 예상값은 2인데 1로 반영됩니다. 이는 다중 스레드가 발생할 수 있는 주요 문제입니다.
이 문제를 어떻게 해결할 수 있나요?
스레드 간섭 오류는 공유 변수에 대한 액세스를 동기화하여 해결할 수 있습니다. 공유된 데이터 간의 업데이트된 값과 동기화를 유지해야 합니다.
이와 함께 두 번째 유형의 오류를 살펴보겠습니다…
메모리 불일치 오류는 일반적으로 서로 다른 스레드가 동일한 데이터 부분을 읽으려고 하거나 일관되지 않은 보기를 가질 때 발생합니다. 이는 일반적으로 첫 번째 스레드가 일부 공유 데이터를 업데이트할 때 발생합니다. 이 업데이트된 값은 두 번째 또는 다른 스레드로 전파되지 않으며 이전 데이터를 읽습니다.
왜 이런 일이 일어나는지 살펴보겠습니다.
글쎄, 여기에는 여러 가지 원인이 있을 수 있습니다. 일반적으로 컴파일러는 성능을 향상시키기 위해 애플리케이션에 여러 가지 최적화를 수행합니다. 또한 성능을 최적화하기 위해 명령 시퀀스를 업데이트할 수도 있습니다. 일반적으로 프로세서는 코드 최적화도 시도합니다. 예를 들어 CPU는 메인 메모리 대신 캐시 메모리나 임시 레지스터에서 변수의 현재 값을 읽을 수 있습니다.
동시성은 모든 OOP 언어의 매우 중요한 기능입니다. 스레딩을 사용하면 여러 프로세스를 서로 병렬로 실행할 수 있습니다. 이는 복잡한 작업을 더 빠르게 실행하는 데 도움이 됩니다. 그러나 장점, 동시성에는 몇 가지 단점도 있습니다. 스레딩을 사용하면 리소스를 많이 사용하게 됩니다.
위 내용은 Java의 동시성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!