- 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 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());
}
}
- 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 |