수업시간 JAVA/이론

Syncronized - 화장실들어가기

SEOKIHOUSE 2023. 5. 18. 23:18
package 싱크로나이즈;

public class Calculator {
	private int memory;
	
	public int getMemory() {
		return memory;
	}
	
	//동기화방법 1
	public synchronized void setMemory(int memory) {
		this.memory = memory;
		try {
//			Thread.sleep(0);
			Thread.sleep(2000); //이거하면 시간걸려서 50(같은메모리) 동기화전
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + ": " +this.memory);
	}
	//동기화 방법2
	Object obj = new Object();
	public void setMemory2(int memory) {
		synchronized(obj) { //this = calculator자신 //obj써도 똑같다
			//즉 객체아무거나 해도 된다 A만들어서 해도 된다
			//그래서 this로 객체안만들고 걍 하는거
			this.memory = memory;
			try {
				Thread.sleep(100); //이거하면 시간걸려서 50(같은메모리)
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName() + ": " +this.memory);
			
		}
	}
}
package 싱크로나이즈;

public class User1 extends Thread {
	private Calculator calculator;
	
	public void setCalculator(Calculator calculator) {
		this.setName("User1"); //setname은 스레드가 갖고있는거임 스레드이름붙이기
		this.calculator = calculator;
	}
	
	@Override
	public void run() {
//		calculator.setMemory(100);
		calculator.setMemory2(10);
	}
}
package 싱크로나이즈;

public class User2 extends Thread {
	private Calculator calculator;
	
	public void setCalculator(Calculator calculator) {
		this.setName("User2");
		this.calculator = calculator;
	}
	
	@Override
	public void run() {
//		calculator.setMemory(50);
		calculator.setMemory2(20);
	}
}
package 싱크로나이즈;

public class MainThreadEx {

	public static void main(String[] args) {
		Calculator calculator = new Calculator();
		//공유객체로 선정함 (같이쓴다) -> 스레드 두개가 calculator주소값 같은거씀
		//예기치못한 결과가 나올수도 있음(둘다 50으로나와서)
		User1 user1 = new User1();
		user1.setCalculator(calculator);
		user1.start();
		
		User2 user2 = new User2();
		user2.setCalculator(calculator);
		user2.start();
		
		User3 user3 = new User3();
		user3.setCalculator(calculator);
		user3.start();
		
		//synchronized쓰면 공유안된다 2초 2초 지나고 따로따로나온다
		//동기화(줄세우기) 시키는것
	}

}