- synchronized는 메서드와 블록 형태로 사용할 수 있으며, synchronized 메서드로 사용될 경우 해당 메서드 내에서 사용되는 모든 멤버 변수들은 락(Lock)이 걸리게 됨.
- synchronized 메서드의 예
-> public synchronized void saveMoney(int save){
// .... 공유자원 - 멤버의 사용
}
-> synchronized 블록의 예
=> 만약 블록 형태로 사용된다면 블록에서 명시한 객체의 멤버들은 모두 락(Lock)에 걸리게 됨.
public void saveMoney(int save){
synchronized(this){
// ...공유자원 - 멤버의 사용
}
}
// 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){
synchronized (this) {
int m = this.getMoney();
try{
Thread.sleep(3000);
}catch (Exception e) {
// TODO: handle exception
}
this.setMoney(m + save);
}
}
// 또는 public void synchronized void saveMoney(int save){
public void minusMoeny(int minus){
synchronized (this) {
int m = this.money;
try{
Thread.sleep(2000);
}catch (Exception e) {
// TODO: handle exception
}
this.setMoney(m - minus);
}
}
// 또는 public void synchronized void minusMoney(int save){
}
public class ParkWife extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
NotSyncMain.myBank.minusMoeny(1000);
System.out.println("minusMoney(1000) : " + NotSyncMain.myBank.getMoney());
}
}
'프로그래밍 정리 > 자바' 카테고리의 다른 글
synchronized의 한계 (0) | 2013.06.17 |
---|---|
synchronized의 활용 (0) | 2013.06.17 |
공유자원의 접근 (0) | 2013.06.17 |
멀티쓰레드와 문제점 (0) | 2013.06.17 |
쓰레드 죽이기 (0) | 2013.06.17 |