"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 멀티스레딩: 엔지니어를 위한 주요 개념 - 1부

멀티스레딩: 엔지니어를 위한 주요 개념 - 1부

2024-11-08에 게시됨
검색:374

Multithreading : Key Concepts for Engineers - Part 1

주요 멀티스레딩 개념을 이해하는 것은 소프트웨어 개발자에게 매우 중요합니다. 이는 기술 세트를 향상시킬 뿐만 아니라 애플리케이션 개발, 확장성 및 소프트웨어 솔루션의 전반적인 품질에 직접적인 영향을 미치기 때문입니다.

원자성

멀티스레딩의 맥락에서 원자성 작업은 스레드가 다른 스레드의 중단 없이 일련의 작업을 실행할 수 있도록 보장합니다. 여러 스레드가 동시에 공유 데이터를 읽거나 쓰려고 시도할 수 있습니다. 원자성이 없으면 동시 수정으로 인해 일반적으로 경쟁 조건이라고 알려진 일관되지 않거나 예상치 못한 결과가 발생할 수 있습니다.

Java 사양은 '읽기'와 '쓰기'가 조합이 아닌 원자적 작업임을 보장합니다. 따라서 '읽고 1을 더한 다음 결과를 다시 쓰는' 작업은 사양에 따라 원자적이지 않습니다. 이러한 연산을 복합 연산이라고 하며 일반적으로 코드에서의 사용법에 따라 원자적이어야 합니다.

원자적 연산의 예:

  1. 카운터 증가: 두 개의 스레드가 원자성 없이 동시에 카운터를 증가시키는 경우 둘 다 동일한 값을 읽고 동일한 증가된 값을 다시 쓸 수 있으므로 하나가 손실될 수 있습니다. 증가.

  2. 공유 변수 업데이트: 원자성 없이 한 스레드가 값을 읽는 동안 다른 스레드가 값을 수정하는 경우 읽기 스레드는 일관되지 않은 값을 얻을 수 있습니다.

원자성 달성:

  • 원자 클래스: 많은 프로그래밍 언어는 원자성이 보장되는 작업을 캡슐화하는 원자 클래스(예: Java의 AtomicIntegerin)를 제공합니다.

  • 동기화된 메서드/블록: Java와 같은 언어에서는 동기화된 키워드를 사용하여 한 번에 하나의 스레드만 코드 블록이나 메서드를 실행할 수 있도록 할 수 있습니다.

  • 잠금: 명시적 잠금(예: ReentrantLockin Java)을 사용하여 공유 리소스에 대한 액세스를 관리합니다.

이익

  • 성능: java.util.concurrent.atomic의 클래스는 스레드 안전을 보장하기 위해 잠금 없는 접근 방식도 제공하므로 많은 시나리오에서 선호되는 선택이 됩니다.
  • 단순성: 원자 클래스를 사용하면 개발자가 잠금을 관리할 필요가 없고 프로그램 논리에 집중할 수 있으므로 코드가 단순화됩니다.
  • 스레드 안전성: 원자적 작업은 데이터 손상이나 경합 조건의 위험 없이 여러 스레드에서 변수가 안전하게 업데이트되도록 보장합니다.

불변성

불변성은 생성된 후에 상태를 수정할 수 없는 객체의 속성을 나타냅니다. 프로그래밍에서 불변 객체는 일단 초기화되면 변경되거나 변경될 수 없는 객체입니다. 불변 객체를 수정하는 대신 원하는 변경 사항을 적용한 새 객체가 생성됩니다.

불변이란 객체의 생성자가 실행을 완료한 후에는 해당 인스턴스를 변경할 수 없음을 의미합니다.

불변 객체의 특성

  • 상태 변경 없음: 불변 객체가 생성되면 해당 상태(속성 또는 필드)는 전체 수명 동안 일정하게 유지됩니다.

  • 스레드 안전: 불변 객체는 수정할 수 없으므로 동기화할 필요 없이 여러 스레드 간에 안전하게 공유할 수 있습니다.

  • 해시코드 안정성: 불변 객체의 해시코드는 수명 내내 동일하게 유지되므로 HashMap 또는 HashSet과 같은 해시 기반 컬렉션에 사용하기에 적합합니다.

불변성 달성:

  • 레코드 사용(Java 14): Java에서 레코드 기능은 불변 데이터 클래스를 생성하는 간결한 방법을 제공합니다.
public record ImmutablePoint(int x, int y) {}
  • 불변 데이터 구조 사용: 다음과 같이 프로그래밍 언어 또는 라이브러리에서 제공하는 기존 불변 데이터 구조를 활용합니다.
  1. Java: Collections.unmodifyingList(), List.of(), Set.of()

  2. C#: ImmutableList, System.Collections.Immutable의 ImmutableArray

  3. Python: 튜플은 본질적으로 불변입니다.

  • 최종 필드 사용: 클래스의 필드를 최종 필드로 선언합니다. 이렇게 하면 객체 생성 중에 필드를 한 번만 할당할 수 있습니다.

  • Setter 없음: 변경 가능한 필드에 대해 setter 메서드를 제공하지 마세요. 이렇게 하면 외부 코드가 객체가 생성된 후 객체의 상태를 변경하는 것을 방지할 수 있습니다.

public final class ImmutablePoint {
    private final int x;
    private final int y;

    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}
  • 정적 팩토리 메소드: 공개 생성자를 제공하는 대신 객체의 새 인스턴스를 반환하는 정적 팩토리 메소드를 사용하여 상태를 변경할 수 없음을 분명히 합니다.

  • 빌더 패턴(복잡한 객체용): 많은 매개변수가 필요한 객체의 경우 빌더 패턴을 사용하여 불변 객체를 만듭니다. 빌더는 매개변수를 축적하고 마지막에 불변 인스턴스를 생성합니다.

이익

  • 동시성: 불변 객체의 내부 구조가 유효하면 항상 유효합니다. 다른 스레드가 해당 개체 내에서 잘못된 상태를 생성할 가능성은 없습니다. 따라서 불변 객체는 스레드로부터 안전합니다.

  • 가비지 수집: 가비지 수집기가 불변 객체에 대해 논리적 결정을 내리는 것이 훨씬 쉽습니다.

아웃트로

이 지식으로 무장하면 고성능 코드 작성 능력이 향상될 뿐만 아니라 응답성과 확장성이 가장 중요한 현대 소프트웨어 개발 과제에 대비할 수 있습니다. 멀티스레딩의 세계로 여행을 계속하면서 숙달한 각 개념은 개발자로서의 성장과 사용자 기대를 충족하거나 초과하는 애플리케이션을 만드는 능력에 기여한다는 점을 기억하세요.

다가오는 글에서는 기아, 교착 상태, 경쟁 조건, OS 스케줄링 등에 초점을 맞춰 여러분의 프로그래밍 기술을 향상시키고 경력을 향상시킬 것이므로 계속 지켜봐 주시기 바랍니다!

참고자료

이 글을 쓸 수 있게 해준 온라인 문서, 커뮤니티 및 모든 리소스에 큰 감사를 드립니다.

  1. 정보 그래픽
  2. 기본 멀티스레딩 개념 이해
  3. 원자성
  4. 불변이란 무엇인가

면책조항: 이 기사는 AI의 도움을 받아 작성되었습니다. 기사 구조와 아이디어 목록은 100% 수동으로 선별되고 조사됩니다. 정보의 정확성을 보장하고 일부 맥락을 추가하기 위해 AI가 생성한 모든 텍스트를 교정합니다.

릴리스 선언문 이 기사는 https://dev.to/anwaar/multithreading-key-concepts-for-engineers-part-1-4g73?1에 복제되어 있습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3