프로그래밍 정리/자바

synchronized의 활용

주누다 2013. 6. 17. 16:43
반응형

- synchronized 블록을 이용할 때 안에 들어가는 객체의 멤버 변수에 대해서 동기화가 보장. 그렇다면 다음과 같이 saveMoney()와 minusMoney()의 메서드에서 synchronized 블록을 사용해도 됨.

-> public void run(){

synchronized(SyncMain2.myBank){

SyncMain2.myBank.saveMoney(3000);

}

}


-> public void run(){

Synchronized(SyncMain2.myBank){

SyncMain2.myBank.minusMoney(1000);

}

}


- synchronized가 객체의 멤버를 상대하기 때문에 해당 객체만 명시해주면 어디서든 사용 가능.


============================================================================================================



public class Bank {


private int money = 10000; // 예금 잔액

public int getMoney(){

return this.money;

}

public void setMoney(int money){

this.money = money;

}

public void saveMoney(int save){

int m = this.getMoney();

try{

Thread.sleep(3000);

}catch (Exception e) {

// TODO: handle exception

}

this.setMoney(m + save);

}

public void minusMoney(int minus){

int m = this.money;

try{

Thread.sleep(2000);

}catch (Exception e) {

// TODO: handle exception

}

this.setMoney(m - minus);

}

}




public class Park extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (SyncMain2.myBank) {
SyncMain2.myBank.saveMoney(3000);
}
System.out.println("saveMoney(3000) : " + SyncMain2.myBank.getMoney());
}
}



public class ParkWife extends Thread{

@Override

public void run() {

// TODO Auto-generated method stub

synchronized (SyncMain2.myBank) {

SyncMain2.myBank.minusMoney(1000);

}

System.out.println("minusMoney(1000) : " + SyncMain2.myBank.getMoney());

}

}




public class SyncMain2 {
public static Bank myBank = new Bank();
public static void main(String[] args) {
Park p = new Park();
ParkWife w = new ParkWife();
p.start();
try{
Thread.sleep(200);
}catch (Exception e) {
// TODO: handle exception
}
w.start();
}
}

==========================================================================================================

 - 위의 예에서 사용된 synchronized 블록의 객체는 SyncMain2.myBank임. 이것의 의미는 SyncMain2.myBank의 멤버 변수에 동기화를 걸겠다는 의미

- synchronized 블록을 이용한 동기화

-> synchronized(SyncMain2.myBank){

// SyncMain2.myBank 멤버의 동기화 보장

}

- synchronized를 사용하는 곳은 어디라도 상관없음. 보통은 공유자원이 있는 클래스에서 사용하는 경우가 일반적.

반응형

'프로그래밍 정리 > 자바' 카테고리의 다른 글

Java Stream(자바 스트림)  (0) 2013.06.17
synchronized의 한계  (0) 2013.06.17
synchronized  (0) 2013.06.17
공유자원의 접근  (0) 2013.06.17
멀티쓰레드와 문제점  (0) 2013.06.17