티스토리 뷰

동기화란? 스레드 간섭과 메모리 일치 오류의 문제를 막는 도구


* 스레드는 동일한 자원을 고유하기 때문에 매우 효율적으로 작업을 처리할 수 있는 반면에 

 다수의 스레드가 공유된 데이터에 접근할 때 방생하는 문제로 스레드 간섭, 메모리 일치 오류

 두가지 문제가 발생한다.




˚ 스레드의 동기화

동기화된 메소드

(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();		
	}
}


반응형
LIST
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함