티스토리 뷰
동기화란? 스레드 간섭과 메모리 일치 오류의 문제를 막는 도구
* 스레드는 동일한 자원을 고유하기 때문에 매우 효율적으로 작업을 처리할 수 있는 반면에
다수의 스레드가 공유된 데이터에 접근할 때 방생하는 문제로 스레드 간섭, 메모리 일치 오류
두가지 문제가 발생한다.
˚ 스레드의 동기화
동기화된 메소드 (Synchronized Methods) |
동기화된 메소드는 동시 호출되더라도 겹치지 않는다. |
스레드가 동기화 된 메소드를 실행하면 그 스레드가 종료될 때까지 모든 스레드는 중지된다. |
|
동기화된 메소드가 종료되면 자동으로 이후 동기화된 메소드 호출은 변경된 상태를 볼 수 있다. |
|
Class ExampleSynchronized{ private int money = 1000; public synchronized void Increase() { money += money; } public synchronized void Decrease() { money -= money; } public synchronized void Print() { println(money); } } |
˚ 스레드간의 조정
폴링 (Polling) |
특정 이벤트를 기다리는 스레드를 작성할때 특정 이벤트 발생시 까지 무한루프로 검사하는 것 |
wait() |
특정 이벤트가 발생하기 까지 대기할 때 사용되는 메소드 |
notifyall() |
어떤 이벤트가 발생했을때 이를 알려주는 메소드 |
동기화(Synchronization) 에 대한 기본적인 이론을 마치고 실습을 통해 공부하도록 하겠습니다.
동기화를 사용한 useTolietFull 메소드와
동기화를 사용하지 않은 명언보기 메소드가 있습니다.
두 가지 메소드를 정의한 Toilet 클래스 입니다.
public class Toilet { private void openDoor(String name) { System.out.println(name + " 이 화장실 문 열었음"); } private void useToilet(String name) { System.out.println(name + " 이 화장실 사용중임"); } private void closeDoor(String name) { System.out.println(name + " 이 화장실 문 닫았음"); } // 동기화가 필요없는 메소드 public void 명언보기(String name){ System.out.println(name+" 이 명언을 봅니다."); } // 캡슐화 진행 // 메소드 동기화는 synchronized 키워드를 붙여주면 된다. -> 동기화된 메소드 public synchronized void useToiletFull(String name){ openDoor(name); useToilet(name); closeDoor(name); } }
Thread를 상속받아 객체동기화의 예제와, Toilet의 두가지 메소드를 사용하는 ToiletThread 클래스입니다.
public class ToiletThread extends Thread { private String name; private Toilet toilet; public ToiletThread(Toilet toilet, String name) { this.toilet = toilet; this.name = name; } @Override public void run() { // // 객체 동기화 // synchronized (toilet) { // toilet.openDoor(name); // toilet.useToilet(name); // toilet.closeDoor(name); // } // 메소드 동기화 // 공유 자원 (공유 객체)의 메소드를 동기화 한다. // 선택적으로 필요한 기능만 동기화가 가능하다. toilet.명언보기(name); // 동기화 안된 메소드 toilet.useToiletFull(name); // 동기화 된 메소드 } }
Thread를 이용하는 메인 클래스 입니다.
public class ExampleSynchronized{ public static void main(String[] args) { Toilet toilet = new Toilet(); ToiletThread toiletThread1 = new ToiletThread(toilet,"A"); ToiletThread toiletThread2 = new ToiletThread(toilet,"B"); ToiletThread toiletThread3 = new ToiletThread(toilet,"C"); toiletThread1.start(); toiletThread2.start(); toiletThread3.start(); } }
'프로그래밍 > Java' 카테고리의 다른 글
자바 ! 파일 입출력2 (Stream, DataInput/Output, ObjectInput/Output) (1) | 2017.05.18 |
---|---|
자바 ! 파일 입출력1 (Stream, Buffered) (0) | 2017.05.17 |
자바 ! 쓰레드 ( Thread, Start , Run, Priority ) (0) | 2017.05.15 |
자바 ! 컬렉션 프레임워크 ( Collection Framework , List, ArrayList, HashSet, TreeSet, HashMap, Iterator) (0) | 2017.05.14 |
자바 ! 제네릭( Generic ) (0) | 2017.05.13 |