14.reentrantlock을 이용한 동기화
ReentrantLock을 이용한 동기화
- 블록 동기화: 동기화의 범위 정하기
기존에는 lock을 끝까지 기다렸다가 하는데 ReentrantLock은 지나친다 ReentrantLock: 지금은 lock일 걸려 있으면 안하겠습니다
package part2;
import java.util.concurrent.locks.ReentrantLock;
public class CharList2 {
private char[] list;
private int index;
private ReentrantLock indexLock; //ReentrantLock를 이용한 동기화
public CharList2() {
indexLock = new ReentrantLock();
list = new char[160];
for (int i = 0; i < 160; 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 (indexLock) { //lock걸기
System.out.printf("%s[%d] : index:%d, char: %c\n", th.getName(), th.getId(), index, list[index]);
index++; // 같은값이 출력된다 (지금 비동기화)
}
}
}
sub2[15] : index:0, char:
sub2[15] : index:1, char:
sub2[15] : index:2, char:
- synchronized없이 사용하기
// synchronized (indexLock) { //
indexLock.lock();
// lock을 소유한자만 안으로 들어 올 수있다
// 두가지를 한덩어리처럼 설정 할 수 있도록 설정하는 임계영역-> 동기화로 묶어놓음
System.out.printf("%s[%d] : index:%d, char: %c\n", th.getName(), th.getId(), index, list[index]);
index++; // 같은값이 출력된다 (지금 비동기화)
// }
indexLock.unlock();
}
}
위와 같은 중복되지 않은 값이 나온다
- lock을 걸지 않고 나중에 다시 올게라고 할 수 있다
indexLock = new ReentrantLock();
list = new char[160]; 객
for (int i = 0; i < 160; 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;
}
boolean aquired = indexLock.tryLock();// lock을 가지는지 확인을 한다
// synchronized (indexLock) { //
// indexLock.lock();
if (aquired) {//lock을 가지면 확인하고
System.out.printf("%s[%d] : index:%d, char: %c\n", th.getName(), th.getId(), index, list[index]);
index++;
indexLock.unlock();
} else {
System.out.printf("%s[%d]: alternater ... \n", th.getName(), th.getId());
}
// }
sub2[15] : index:157, char: ?
sub2[15] : index:158, char: ? //alternater가 빠졌기 때문에 (lock걸림)-> 159
sub1[14] : index:159, char: ?
댓글남기기