티스토리 뷰
동기화란? 스레드 간섭과 메모리 일치 오류의 문제를 막는 도구
* 스레드는 동일한 자원을 고유하기 때문에 매우 효율적으로 작업을 처리할 수 있는 반면에
다수의 스레드가 공유된 데이터에 접근할 때 방생하는 문제로 스레드 간섭, 메모리 일치 오류
두가지 문제가 발생한다.
˚ 스레드의 동기화
동기화된 메소드 (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 |
