수업시간 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초 지나고 따로따로나온다
//동기화(줄세우기) 시키는것
}
}