synchronized
키워드를 사용하지 않았을 경우 기대값 12000이 아닌 13000이 나오게 된다.synchronized
키워드를 사용하면 먼저 호출된 saveMoney()가 실행된 다음 minusMoney()메서드가 실행되어 문제없이 기대값 12000이 나오게 된다.class Bank{
private int money = 10000;
public synchronized void saveMoney(int save){
int m = this.getMoney();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
setMoney( m + save);
}
public synchronized void minusMoney(int minus){
int m = this.getMoney();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
setMoney( m - minus);
}
public int getMoney(){
return money;
}
public void setMoney(int money){
this.money = money;
}
}
class Kim extends Thread{
public void run(){
System.out.println("start save");
SyncMain.myBank.saveMoney(3000);
System.out.println("saveMoney(3000): " + SyncMain.myBank.getMoney());
}
}
class KimMother extends Thread{
public void run(){
System.out.println("start minus");
SyncMain.myBank.minusMoney(1000);
System.out.println("minusMoney(1000): " + SyncMain.myBank.getMoney()); }
}
public class SyncMain {
public static Bank myBank = new Bank(); //공유자원
public static void main(String[] args) throws InterruptedException {
Kim k = new Kim();
k.start();
Thread.sleep(200);
KimMother km = new KimMother();
km.start();
}
}
Lock
하여 다른 Thread의 접근을 제어한다.DeadLock
에 빠질 수 있으므로 주의가 필요하다.현재 객체 또는 다른 객체를 Lock으로 만든다.
synchronized(참조형 수식) {
수행문;
}