Backend/java

쓰레드의 동기화

IT grow. 2018. 8. 16. 04:16
반응형

쓰레드의 동기화 – synchronized


1.     한 번에 하나의 쓰레드만 객체에 접근할 수 있도록 객체에 락(lock)을 걸어서 데이터의 일관성을 유지하는 것


쓰레드 동기화 예제 


package Practice;
public class synchronizedExample implements Runnable{
Account acc = new Account();
public void run()
{
while(acc.balance>0)
{
int money = (int)(Math.random()*3 +1)*100; // 100,200,300
acc.withdraw(money);
System.out.println("balance : " + acc.balance);
}
}
}
class Account {
int balance = 1000;
public void withdraw(int money) {
if (balance >= money) {
try {
Thread.sleep(1000);
} catch (Exception e) {
}
balance -= money;
}
}
}


결과값 


      


2.     동기화의 효율을 높이기 위해 wait() , notify()를 사용

3.     Object클래스에 정의되어 있으며 , 동기화 블록 내에서만 사용할 수 있다.

4.     Wait() – 객체의 lock을 풀고 해당 객체의 쓰레드를 waiting pool에 넣는다.

5.     Notify() – waiting pool에서 대기중인 쓰레드 중의 하나를 깨운다.

6.     notifyAll() – waiting pool에서 대기중인 모든 쓰레드를 깨운다.


반응형