라벨이 (Java멀티쓰레드 디자인패턴)인 게시물 표시

(Java) 자바 메모리 모델

이미지
* Java의 메모리 모델이란 Java의 쓰레드가 메모리에 액세스 할 떄 어떤 일이 일어나는지 규정하는 것이다. * 자바 메모리 모델과 친해지기 위한 지침 복수 쓰레드에서 공유하는 필드는 synchronized 또는 volatile로 보호하라 불변 필드는 final하라 생성자안에서 this를 놓치지 말라 1. reorder 2. visibility 3. 공유메모리와 액션 4. synchronized 5. volatile 6. final 7. Double-Checked Locking 패턴 1.  reorder -> reoreder란 최적화를 위해 컴파일이나 Java 가상머신이 프로그램의 처리순서를 바꾸는 것을 말한다. reorder는 수행능려을 높이는데 널리 사용되지만 그 사실을 프로그래머가 의식하는 경우는 거의 없다. 실제 싱글 쓰레드 프로그램에서는 reorder가 이뤄지고 있는지 판단할 수 없다. 그러나 멀티쓰레드 프로그램에서는 reorder가 원인이 되어 이상 작동을 하는 경우가 있다. 자바의 컴파일러는 자바 코드를 바이트 코드로 컴파일 하면서 정해진 범위 내에서 자유롭게 최적화를 수행할 수 있다. 이런 최적화에는 단순히 코드의 특정 구문을 보다 효율적인 다른 구문으로 치환하는 경우도 있지만, 때론 중복된 구문을 삭제하거나 구문 간의 순서를 재배치함으로써 소기의 목적을 달성하기도 한다. 뿐만 아니라 CPU의 연산 시에도 인스트럭션을 재배열하거나 보다 작은 마이크로 인스트럭션으로 나눠서 처리할 수도 있기 때문에 자바로 작성된 프로그램의 정확한 수행 순서를 예측하기란 쉽지가 않다. 자바는 앞서 설명한 happens-before 관계를 보장함으로써 일반적인 단일 스레드 환경에서의 수행 순서를 보장하고 있지만, 멀티스레딩 환경에선 최적화에 따른 재배열(reordering)이 예상치 못한 가시성의 문제를 일으키지 않도록 보장하기 위해 명시적으로 동기화를 처리해 happens-bef...

(Java멀티쓰레드 디자인패턴) Single Threaded Execution

* SharedResource(공유자원) 역할 -> SharedResource 역할을 하는 클래스는 복수의 쓰레드에서 액세스한다. SharedResource는 몇개의 메소드를 가지는데 대체로 2종류로 분류된다. safeMethod : 복수의 쓰레드에서 호출해도 아무런 문제가 없는 메소드 unsafeMethod : 복수의 쓰레드가 호출하면 안되기 때문에 가드(Guard)가 필요한 메소드 자바에서는 unsafeMethod를 synchronized 로 함으로써 가드한다. 싱글쓰레드로 동작시켜야 하는 범위를 크리티컬 섹션이라한다. ------------------------------------------------------------------------------------------------- <적용가능성> 멀티쓰레드 복수의 쓰레드가 액세스 할 때 : 멀티쓰레드 프로그램이더라도 모든 쓰레드가 독립적으로 동작하고 있다면 SingleThreaded Execution 패턴을 사용할 필요가 없다. 상태가 변화할 가능성이 있을 때 : 인스턴스가 만들어진 후에 상태가 변화할 가능성이 전혀 없다면 Single Threaded Execution 을 사용할 필요가 없다. 이것이 Immutable패턴이다.  안전성을 확보할 필요가 없을 때  * Single Threaded Execution의 문제점은 데드락을 일으킬 수 있다는 것이다 <크리티컬 섹션의 크기와 수행능력> 락을 취득하는데 시간이 걸리기 때문 ->synchronized메소드에 들어갈 때에는 객체의 락을 취하게 되는데 이 처리에는 시간이 걸리게 된다.      2. 쓰레드의 충돌로 대기하게 되기 때문 -> 쓰레드 A가 크리티컬 섹션에서 처리를 실행하고 있는 동안 크리티컬 섹션에 들어가려고 했던 쓰레드 B는 블록한다. 이러한 상황을 쓰레드의 충돌...

(Java 멀티쓰레드 디자인패턴) 멀티쓰레드 프로그램 평가기준

1. 안전성(safety) : 객체를 망가뜨리지 않는 것. (즉, 객체의 필드가 예상외의 값을 갖지 않는 것) 또한 복수의 쓰레드가 이용해도 안전성이 유지되는 클래스를 쓰레드 세이프 클래스라 부른다. 2. 생존성(liveness) : 필요한 처리가 언젠가 반드시 이루어지는 것을 말함. 한편 안전성과 생존성은 서로 상반되기도 한다. 예를들어, 안전성만 중시하다가 생존성을 잃을 수도 있다. 그 사례가 데드락이다. 이것은 복수의 쓰레드가 서로 상대편에서 락을 해제하기를 기다리는 상황이다. 3. 재사용성(reusability) : 클래스를 다시 사용할 수 있는 것. 필수는 아니지만 품질을 높이는데 중요하다. java.util.concurrent 패키지에서는 멀티쓰레드 프로그래밍에 편리한 재사용성이 높은 클래스를 제공한다. 4. 쓰루풋(throughput) : 단위시간당 처리수 5. 응답성(responsiveness) : 요구를 한뒤 반응이 나타날때까지 걸리는 식ㄴ ---------------------------------------------------------------------------------------------------

(Java멀티쓰레드 디자인패턴) 순차,병렬,병행의 개념

*순차(Sequential): 복수의 업무를 [순서대로 처리]해 나가는 모습. 예를들어, 한 명이 100개의 업무를 처리할 떄 그 사람이 업무를 순차적으로 처리해 나가는 것과 마찬가지이다. *병렬(Parallel): 복수의 업무를 [동시에 처리]하는 모습. 예를들어, 10개의 업무를 2명이 분담하여 처리할 때 두 사람이 업무를 병렬적으로 처리해 나가는 것과 같은 이치. *병행(concurrent): 순차, 병렬보다 추상도가 높은 표현이다. 이것은 한 개의 업무를 [어떠한 순서로 처리하든 상관없는 여러 개의 작업]으로 분할하는 모습. 10개의 업무를 2종류의 독립된 작업으로 분할해 두면 병행 처리할 수 있는 준비가 끝난다. 작업자가 한명이라면 병행 처리 할 수 있도록 분할해 둔 작업을 순차적으로 처리하게 되지만, 작업자가 2명이라면 같은 작업을 병렬적으로 처리할 수도 있다. 멀티쓰레드 프로그램은 병행처리를 기술한 것이다. 만일 CPU가 한개라면 병행처리를 순차적으로 실행할 테고, CPU가 여러 개라면 병행처리를 병렬적으로 실행할지도 모른다. 우리가 사용하고 있는 컴퓨터는 대개 CPU가 한 개이므로 복수의 쓰레드가 작동하고 있다 하더라도 병행처리를 순차적으로 실행하게 된다.

(Java멀티쓰레드 디자인패턴)1장 Java언어의 쓰레드

이미지
한문장 실행->두번째 문장 실행->세번째 문장 실행 처리의 흐름이 계속 한 줄의 실처럼 이어지는 프로그램을 싱글 쓰레드 프로그램이라고 한다. 싱글쓰레드 프로그램에서는 [프로그램을 실행하고 있는 주체]는 한개 뿐이다. *메인클래스를 생성하면 메인쓰레드가 1개 실행된다. 그러나 엄밀히말하면 무대 뒤에서도 동작한다. 가비지콜렉션(Garbage Collection)용 쓰레드나 GUI관련 쓰레드 등이 존재한다. <멀티쓰레드 프로그램> *GUI응용프로그램 *시간이 걸리는 I/O처리 (자바에서는 java.nio패키지를 제공한다.) *복수 클라이언트 <Thread클래스의 run메소드와  start메소드> 쓰레드를 기동시킬 때는 java.lang.Thread클래스를 사용한다. 1. 상속 받는 경우 예) public class MyThread extends Thread{   public void run() {    for(int i=0;i<10000;i++)     {       System.out.println("Nice");     } } } --->새로 기동되는 쓰레드의 동작은 run()메소드에서 기술한다. run메소드가 종료되면 쓰레드도 종료된다. 2. 쓰레드 클래스의 인스턴스를 생성한 예제 public class Main{    public static void main(String[] args){      MyThread t=new MyThread();      t.start();      for(int i=0;i<10000;i++)      {        System.out.print(...

(Java 멀티쓰레드 디자인 패턴) 0장 UML

이미지
<클래스와 계층관계> abstract클래스(추상클래스)-이름은 기울임체로 적는다 static 필드(클래스필드)-이름에는 밑줄을 그는다 abstract메소드(추상메소드)-기울임체로 적는다 static 메소드(클래스메소드)- 이름에는 밑줄을 긋는다. 인터페이스의 이름도 기울임체로 적는다. **서브클래스가 슈퍼클래스를 상속 받았을 때 UML에서 서브클래스->슈퍼클래스로 화살표가 향하는 이유는 서브클래스는 슈퍼클래스를 알고 있지만 슈퍼클래스가 항상 서브클래스를 알고 있는 것이 아니기 때문이다. <인터페이스와 구현> **구현클래스와 인터페이스와의 관계는 점선이 있는 화살표로 표시한다. 그런 후 인터페이스 클래스 다이어그램에는 <<interface>>를 적는다. <집합연관(aggregation)> Color(색), Fruit(과일), Basket(바구니)클래스가 있다. class Color{//.....} class Fruit{   Color color; } class Basket{  Fruit[] fruit; } 이때, Basket클래스는 Fruit클래스의 fruit필드를 가지며 Fruit클래스는 Color클래스의 color필드를 가지고 있다. 이처럼 [가지고 있는] 관계를 집합 연관(aggregation)이라고 한다. 흰머리 마름모가 붙어있는 실선은 집합 연관을 나타낸다. <액세스 제어> +가 붙어있으면 public한 메소드나 필드를 의미하며, -가 붙어있으면 private한 메소드나 필드를 의미하며 #이 붙어있으면 protected한 메소드나 필드를 의미한다. class Something {  private int privateField;  protected int protectedField;  public int int publicField;  private void pri...