내가 보려고 정리하는/JAVA

쓰레드 동기화

보동이용용 2022. 12. 28. 09:29
반응형

메인.-쓰레드 객체 생성, 시작

public static void main(String[] args) {
		ShareObject sObj = new ShareObject();	// 공통으로 사용할 객체 생성
		
		TestThread th1 = new TestThread("Test1", sObj);
		TestThread th2 = new TestThread("테스트2", sObj);
		
		th1.start();
		th2.start();
	}

테스트 클래스를 만들어서 생성자에 쓰레드 이름과 공통으로 사용할 객체를 파라미터로 받는다.

class TestThread extends Thread{
	private ShareObject sObj;
	
	// 생성자
	public TestThread(String name, ShareObject sObj) {
		super(name);	// 쓰레드의 name속성 설정
		this.sObj = sObj;
	}
	
	@Override
	public void run() {
		for(int i=0; i<10; i++) {
			sObj.add();
		}
	}
}

이렇게 실행하면.... 결과가 뒤죽박죽.... !

10부터 차례로 더해지지만 출력할 때는 10->20->50->30-> ... 200 : 이런 식으로 뒤죽박죽 나온다.

결국 200은 나오지만 과정 출력이 이상함.

서로 객체를 동시에 사용해서 그럼.

// !! 잘못된 것

// 공통으로 사용할 객체 
class ShareObject{
	private int sum = 0;
	
	public void add() {	
	
        int n = sum;

        n += 10;

        sum = n; ///sum이 10씩 더해지도록 하는데 과정에서 다른 쓰레드가 끼어드는 확률을 높이려고 과정을 쪼갰음.

        System.out.println(Thread.currentThread().getName() + " 합계 : " + sum);
		
	}
}

동기화 처리를 해서 락을 걸어버리면 하나의 쓰레드가 다 사용한 후에 다음 쓰레드가 사용하므로

교착상태가 되지 않을 수 있다.

 

 

 

//synchronized

 

방법1) 메서드 자체에 동기화 설정을 한다. 
 public synchronized void add() {

 

방법2) 동기화 블록으로 설정한다.

synchronized (참조값){

      동기화 필요한 내용...! (쓰레드가 공통으로 사용하는 자료)

}

class ShareObject{
	private int sum = 0;
	
	// 동기화 처리하기
	
	// 방법1) 메서드 자체에 동기화 설정을 한다. ///synchronized
	// public synchronized void add() {
		
	public void add() {	
		
		// 방법2) 동기화 블록으로 설정한다.
		synchronized (this) {
			int n = sum;
			
			n += 10;
			
			sum = n; ///sum이 10씩 더해지도록 하는데 과정에서 다른 쓰레드가 끼어드는 확률을 높이려고 과정을 쪼갰음.
			
			System.out.println(Thread.currentThread().getName() + " 합계 : " + sum);
		}
	}
}

 

 

 

------ 결  과  -------

테스트2 합계 : 10
테스트2 합계 : 20
테스트2 합계 : 30
Test1 합계 : 40
Test1 합계 : 50
Test1 합계 : 60
Test1 합계 : 70
Test1 합계 : 80
Test1 합계 : 90
Test1 합계 : 100
Test1 합계 : 110
Test1 합계 : 120
Test1 합계 : 130
테스트2 합계 : 140
테스트2 합계 : 150
테스트2 합계 : 160
테스트2 합계 : 170
테스트2 합계 : 180
테스트2 합계 : 190
테스트2 합계 : 200

 

 

-------------------------------> 차례로 예쁘게 나온다.

반응형