4-4.(2) Thread 동기화 Sync1

zhyun·2020년 9월 23일
0

HighJava

목록 보기
32/67
post-custom-banner

synchronized를 이용한 동기화 처리

T15_SyncThreadTest

  • (1) 공통으로 사용할 데이터 클래스 ShareObject의 객체 sObj 생성
  • (2) 쓰레드 WorkerThread 에 공통으로 사용할 객체 sObj 넘겨줌
public class T15_SyncThreadTest {
	public static void main(String[] args) {
		ShareObject sObj = new ShareObject(); // 공유 객체 만들기
		
		WorkerThread th1 = new WorkerThread("1번쓰레드", sObj);
		WorkerThread th2 = new WorkerThread("2번쓰레드", sObj);
		
		th1.start();
		th2.start();
	}
}

동기화 하는 방법

  • 방법1> 메서드 자체에서 동기화 처리하기
    : public synchronized void add() / synchronized public void add()
    : synchronized 순서 상관 없음
  • 방법2> synchronized 동기화 블럭으로 설정하기
    공통으로 사용할 객체
class ShareObject {
	private int sum = 0;
	
	//동기화 하는 방법1 :메서드 자체에 동기화 처리하기
    //public synchronized void add()
	public void add() { // synchronized => 1번 작업끝날때까지 기다렸다가 2번 완료(콘솔창)
						//		위치2	 => synchronized public void add()
		for(int i=0; i<1000000000; i++) {} //동기화 처리 전까지의 시간벌기용

		//동기화 하는 방법2 :  synchronized 동기화 블럭으로 설정하기
		synchronized (this) { // (10,20,30...220)결과만 순서대로
			int n = sum;
			n += 10; //10증가
			sum = n;
			
			System.out.println(Thread.currentThread().getName()+"합계 : "+sum);
			// currentThread() -> 현재 돌고 있는 스레드(ShareObject)dml 객체 출력 
		}
	}
}

작업을 수행하는 쓰레드 클래스

class WorkerThread extends Thread{
	ShareObject sObj;

	public WorkerThread(String name, ShareObject sObj) {
		super(name);
		this.sObj=sObj;
	}
	
	@Override
	public void run() {
		for (int i = 0; i <= 10; i++) {
			sObj.add();
		}
	}
}

동기화 방법

메서드 자체에서 처리하기

  • 전체적으로 1번 작업이 끝나면 2번 작업 완료

synchronized 동기화 블럭으로 설정

  • 그 부분만 차례대로 출력
profile
HI :)
post-custom-banner

0개의 댓글