1 분 소요

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: ?

카테고리:

업데이트:

댓글남기기