JAVA Programming/JAVA 개념 정리

JAVA Synchronized 스레드 동기화

psy_er 2024. 4. 2. 16:46
728x90

JAVA Synchronized 스레드 동기화

 

스레드 동기화 (Thread Synchronized)

 

멀티스레드 환경에서 여러 스레드가 하나의 공유자원에 동시 접근하지 못하게 막는 것이다.

공유데이터가 사용되어 동기화가 필요한 부분을 임계영역(critical section)이라고 부르고, 이 임계영역에 synchronized 키워드를 사용해 여러 스레드가 동시에 접근하는 것을 방지하여 동기화시킨다.

 

Synchronized로 지정된 임계영역은 한 스레드가 접근해 사용할 때 lock이 걸림으로써 다른 스레드가 접근 불가능 하도록 해줍니다. 해당 스레드가 임계영역의 코드를 모두 실행한 후 벗어나게 된다면 unlock 상태가 되고, 다른 스레드가 임계영역에 접근하여 다시 lock을 걸고 사용가능하게 된다.

 

 

스레드 동기화 방법

 

1) 메서드에 synchronized 설정

메서드 이름 앞에 synchronized 키워드를 사용하여 해당 메서드 전체를 임계영역으로 설정

synchronized void increase(){
   count++;
   System.out.println(count);
}

 

2) 코드블록에 synchronized 설정

동기화 임계영역이 넓으면 효율이 떨어지기 때문에 코드블록 단위로 임계영역을 지정할 수 있다.

void increase(){
   synchronized(this){
      count++;
      }
      System.out.println(count);
}

 

실행 예제 1

public class HelloWorld {
	public static void main(String[] args) {
		StringDisplay sd = new StringDisplay();
		MyThread[] mts = new MyThread[5];
		for (int i=0; i<mts.length; i++) {
			mts[i] = new MyThread(sd, Integer.toString(i));	
			mts[i].start();
		}
	}
}

class StringDisplay {
	synchronized void display(String s) {
		for (int i=0; i<5; i++) {
			System.out.print(s);
		}
		System.out.println("");
	}
}

class MyThread extends Thread {
	StringDisplay sd;
	String s = "";
	
	public MyThread(StringDisplay sd, String s) {
		this.sd = sd;
		this.s = s;
	}
	
	@Override
	public void run() {
		sd.display(s);
	}
}

[실행결과]
00000
22222
11111
44444

 

실행 예제 2

public class HelloWorld {
	public static void main(String[] args) {
		MyThread[] mts = new MyThread[5];
		for (int i=0; i<mts.length; i++) {
			mts[i] = new MyThread();	
			mts[i].start();
		}
	}
}

class MyThread extends Thread {
	public static int number = 0;
	public static Object lock = new Object(); 
	
	@Override
	public void run() {
		synchronized(lock) {
			for (int i=0; i<5; i++) {
				number = number + 1;;
				System.out.print(i);
			}
			System.out.println(":" + number + "-" + this.getName());
		}
	}
}

[실행결과]
01234:5-Thread-0
01234:10-Thread-2
01234:15-Thread-1
01234:20-Thread-4
01234:25-Thread-3

 

 

출처: https://kadosholy.tistory.com/123 [KADOSHoly:티스토리]

728x90