1 분 소요

메소드 단위의 동기화

다른 스레드의 개입이 발생->다른얘가 끼어들지 않게 한다

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

카테고리:

업데이트:

댓글남기기