두서없는 공부 노트/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 키워드는 여러개의 스레드가 한개의 자원을 사용하고자 할 때,
현재 데이터를 사용하고 있는 해당 스레드를 제외하고 나머지 스레드들은 데이터에 접근 할 수 없도록 막는 개념
반응형