결국 무엇이든 해내는 사람

Day 14 - 쓰레드를 이용하여 동기화를 수행해보자 (Syncronized) 본문

두서없는 공부 노트/JAVA

Day 14 - 쓰레드를 이용하여 동기화를 수행해보자 (Syncronized)

kkm8257 2020. 9. 2. 18:52
반응형

package Thread_EggGame;

public class Egg_Box {

	
	int egg_count=0;
	
	int packed_egg=0;
	
}

에그 박스를 만든다. 이는 거위(스레드 한개) 와 주인장(스레드 한개) 총 두개의 스레드가 공유할 영역이다.

package Thread_EggGame;

public class Duck extends Thread {

	Egg_Box eggBox;

	@Override
	public void run() {

		while (true) {

			synchronized (eggBox) {
				eggBox.egg_count += 1;
				System.out.println("달걀의 개수 : " + eggBox.egg_count);
				
			}
			
			try {
				
				Thread.sleep(2000);

			} catch (Exception e) {

				System.out.println(e);

			}


		}

	}

}
package Thread_EggGame;

import java.util.Scanner;

public class Duck_Owner extends Thread {

	Egg_Box eggBox;
	Scanner sc = new Scanner(System.in);

	int countSec = 0;

	String input = " ";

	@Override
	public void run() {

		while (true) {

			if (sc.nextLine() != null) {

				System.out.println("HIHIHIHI");
				synchronized (eggBox) {
					System.out.println("달걀을 모두 회수합니다.");

					eggBox.packed_egg += eggBox.egg_count;
					eggBox.egg_count = 0;

					System.out.println("---------------------------");
					System.out.println("남은 달걀 : " + eggBox.egg_count);
					System.out.println("포장된 달걀 : " + eggBox.packed_egg);
					System.out.println("---------------------------");

					
					try {
						Thread.sleep(7000);
					} catch (Exception e) {
						System.out.println(e);
					}
					
					
					//이거 syncronized 할때, try catch문 사용시 , sleep 에만 사용해주는게좋음
					//try 안에다가 싱크로나이즈 싹다 넣고 막 돌렸더니, 다른 클래스의 싱크로나이즈와 충돌발생
					
				}

				

			}
		}

	}
}

 

시원하게 쓰레드 작성

이때 동기화를 통해서 에그박스 공통영역 접근을 제한한다

중요한건 동기화시 try catch문을 sleep을 쓰려고 사용하였다가 낭패를 봄

트라이 캐치문은 깔끔하게 sleep만 제어해주도록 해보자 .. 이유는 아마 충돌이 나나봄

 

 

package Thread_EggGame;

public class main_egg {

	public static void main(String[] args) {
		
		
		
		Egg_Box eggBox=new Egg_Box();
		Duck duck = new Duck();
		Duck_Owner duck_owner = new Duck_Owner();
		
		duck.eggBox=eggBox;
		duck_owner.eggBox=eggBox;
		
		
		
		duck.start();
		duck_owner.start();
		
		
	}
}
​

 

 

 



간단 정리

synchronized가 있으면

synchronized(share) {}

중괄호 안을 수행하는 동안 share라는 범위의 자원을 건들지말라는 뜻

그니까 다른 프로세스가 share에 접근하려고하면 중괄호 내용 수행이 끝날때까지 대기상태에 들어가는것

자바에서 지원하는 Synchronized 키워드는 여러개의 스레드가 한개의 자원을 사용하고자 할 때,

현재 데이터를 사용하고 있는 해당 스레드를 제외하고 나머지 스레드들은 데이터에 접근 할 수 없도록 막는 개념


반응형
Comments