12.메소드 단위의 동기화
메소드 단위의 동기화
다른 스레드의 개입이 발생->다른얘가 끼어들지 않게 한다
package part2;
public class CharList {
private char[] list; // 배열이 스레드에서
private int index;
public CharList() {
list = new char[240]; // list에 240개의 list와 index가 있는데 그것을 객체화 하여 printNext로 호출한다
// 각각 같은 값의 인덱스를 가지면 상관없는데 중복이 되는경우가 발생하면 안됨
for (int i = 0; i < 240; i++)
list[i] = (char) i;
index = 0;
}
public void printNext() {
Thread th = Thread.currentThread();
char ch = list[index];
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
return;
}
//
// synchronized(this)
// lock을 소유한자만 안으로 들어 올 수있다
// 두가지를 한덩어리처럼 설정 할 수 있도록 설정하는 임계영역-> 동기화로 묶어놓음
System.out.printf("%s[%d] : index:%d, char: %c\n", th.getName(), th.getId(), index, list[index]);
index++; // 같은값이 출력된다 (지금 비동기화)
}
}
//스레드가 다름에도 불구하고 같은 번호대를 출력한다
sub2[15] : index:0, char:
sub1[14] : index:0, char:
따라서 동기화를 한다
synchronized (this) {
System.out.printf("%s[%d] : index:%d, char: %c\n", th.getName(), th.getId(), index, list[index]);
index++; // 같은값이 출력된다 (지금 비동기화)
}
}
}
sub1[14] : index:42, char: *
sub2[15] : index:43, char: +
sub1[14] : index:44, char: ,
sub2[15] : index:45, char: -
sub1[14] : index:46, char: .
sub2[15] : index:47, char: /
sub1[14] : index:48, char: 0
sub2[15] : index:49, char: 1
sub1[14] : index:50, char: 2
- 임계영역이 메소드 단위일 경우
public synchronized void printNext() {
Thread th = Thread.currentThread();
char ch = list[index];
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
return;
}
// synchronized (this) {
음
System.out.printf("%s[%d] : index:%d, char: %c\n", th.getName(), th.getId(), index, list[index]);
index++; // 같은값이 출력된다 (지금 비동기화)
}
}
sub1[14] : index:42, char: *
sub2[15] : index:43, char: +
sub1[14] : index:44, char: ,
sub2[15] : index:45, char: -
sub1[14] : index:46, char: .
sub2[15] : index:47, char: /
sub1[14] : index:48, char: 0
sub2[15] : index:49, char: 1
sub1[14] : index:50, char: 2
댓글남기기