임계 영역
- 동시에 여러 개의 스레드가 특정 소스코드 혹은 메서드를 동시에 접근할 경우 해당 메서드를 서로 사용하려고 하는데 이처럼 여러 개의 스레드가 동시에 접근할 수 있는 코드 영역 혹은 메서드를 임계 영역이라고 부른다
- 프로그램에서 임계 영역이 있을 경우 프로그램 전체의 심각한 오류를 발생 시킬 수도 있다
- 자바에서는 동기화를 통해 이러한 부분을 해결할 수 있다
동기화
- 동기화를 하게 되면 임계 영역 때문에 발생되는 문제를 막아 줄 수 있다
- 동기화를 하게 되면 스레드가 접근하는 순서대로 코드를 처리하고 늦게 도착하는 스레드는 기다렸다가 먼저 도착한 스레드의 작업이 완료가 되면 다음 스레드가 작업을 하게 된다
- 동기화는 메서드를 동기화 하는 방법과 코드의 일부분을 동기화하는 방법으로 나눠진다
메서드의 동기화
- 여려 개의 스레드가 호출하는 메서드가 있다고 한다면 메서드의 코드는 임계 영역에 해당한다
- 이런 경우에는 메서드 전체를 동기화 하면 되는데 다음과 같이 작성해 주면 된다
public synchronized void method( ) {
임계 영역 코드
}
Sync1.java
--------------------------------------------------------------------------------------------------------------------------
DataClass d = new DataClass( );
Thread1 t1 = new Thread1(d);
Thread1 t2 = new Thread1(d);
t1.setName("T1");
t2.setName("T2");
t1.start( );
t2.start( );
class Thread1 extends Thread{
DataClass dc;
public Thread(DataClass dc) {
this.dc = dc;
}
public void run( ) {
dc.method(Thread.currentThread( ).getName( ));
}
}
class DataClass{
public synchronized void method(String name) {
for(int i = 0 ; i < 10 ; i++) {
try {
Thread.sleep(1000);
}catch(Exception e) { }
System.out.println(name + " : " + i);
}
}
}
--------------------------------------------------------------------------------------------------------------------------
코드의 동기화
- Run 메서드의 코드 일부분을 동기화하고자 할 때 임계 영역에 해당하는 코드 부분을 synchronized 블록으로 묶어 주면 된다
Synchronized(클래스 혹은 객체) {
임계 영역 코드
}
Sync2.java
--------------------------------------------------------------------------------------------------------------------------
Thread1 t = new Thread1( );
Thread t1 = new Thread(t, "T1");
Thread t2 = new Thread(t, "T2");
t1.start( );
t2.start( );
class Thread1 extends Thread{
public void run( ) {
synchronized(this) {
for(int i = 0 ; i < 10 : i++) {
try {
Thread.sleep(1000);
}catch(Exception e) { }
System.out.println(Thread.currentThread().getName( ) + " : " + i);
}
}
}
}
--------------------------------------------------------------------------------------------------------------------------
'자바' 카테고리의 다른 글
Java wrapper (0) | 2020.07.04 |
---|---|
자바 예외처리 (0) | 2020.06.30 |
스레드 우선 순위 (0) | 2020.06.28 |
스레드(thread) (0) | 2020.06.27 |
인터페이스(interface) (0) | 2020.06.27 |