본문 바로가기

study/앱프로그래밍

[app] thread.txt

Thread Example(https://www.booksr.co.kr/html/book/book.asp?seq=697068)

 

Q : 공유변수 val이 있다. thread에서는 val을 반복문을 이용하여 총 10000번 증가시킨다.

thread를 4개 선언한 후 실행시키면 공유변수 val의 값이 40000이 될 수 있을까 ?

 

A : 작업을 2번 했는데 1번밖에 하지 못하는 경우가 발생
--> 공유자원을 다중 Thread가 동시에 접근하면서 문제 발생
---> Thread 동기화 문제

공유자원을 접근할 필요가 있을 때 단 1개의 Thread만이 접근할 수 있도록 해둔다.

 

Thread 동기화(Synchronization)
: allows only one thread to use the queue.

 

Race Condition
:공유자원을 하나 이상의 동시적으로 수행이 가능한 Task를 동시접근 했을때 생기는 문제들
경쟁 상태란 공유 자원에 대해 여러 개의 프로세스가 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말한다. 동시에 접근할 때 자료의 일관성을 해치는 결과가 나타날 수 있다. 이를 방지하기 위해서는 프로세스 협력 기법이 필요하다.
문제 해결 : 한개의 Thread에서만 독점적으로 수행해야 하는 코드의 구간 즉, Critical Section을 정의하고, Semaphore 혹은 Synchronized 키워드를 이용하여 Thread를 Synchronization 시킨다.

 

Thread 동기화 해결 방법

1. Semaphore
2. using synchronized keyword
어떠한 method가 또는 코드블럭이 한개의 thread에서 접근 할 수 있도록
3. AtomicInteger

 

<Semaphore를 이용한 해결 코드>

package kr.ac.sejong.java8;

public class App{
	//공유변수(static: class의 멤버변수가 아니라 전역변수)
	public static int val = 0;

	//semaphore도 공유자원
	public static Semaphore sem;

	public static void main(String[] args){
		//최대 1개의 Thread가 임계 구역에 들어갈 수 있다.
		//1개짜리 Semaphore == Mutex

		sem = new Semaphore(1);

		//runnable을 instance화 한다.
		IncreasingThread r1 = new IncreasingThread();
		//Thread(runnable을 담아서 Thread를 만든다)
		Thread t1 = new Thread(r1);
		t1.start();

		//4개의 Thread를 생성해서 시작
		new Thread.(new IncreasingThread()).start();
		new Thread.(new IncreasingThread()).start();
		new Thread.(new IncreasingThread()).start();

		Thread.sleep(5000);
		System.out.printIn(val);
	}
}
package kr.ac.sejong.java8;

public class IncreasingThread implements Runnable{

	@Override
	public void run(){
		for(int i = 0; i < 10000; i++){
			try{
				//화장실 키를 얻는다
				App.sem.acquire();

				//Critical Section의 시작
				App.val++;
				//Critical Section의 종료

				//화장실 키를 반납한다.
				App.sem.release();
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}
}

<식사하는 철학자 문제 >
Dining Philosopher problem
:n명의 철학자 -> 철학자 Thread로 추상화 될 수 있음

 

while(true){
: N개의 포크(공유자원)
포크를 한개 씩 집는다(2개 있어야 식사 가능)
파스타를 먹는다
포크를 한개씩 놓는다
생각을한다
}

 

공유 자원이 Synchronized가 되지 않았을 때 : 포크를 뺏어간다
Synchronization 기법을 통해 해결 가능하다.
(포크를 누가 선점하면 기다려야 함)
모두 자기 오른쪽의 포크를 잡았다면 모든 철학자가 왼쪽 포크를 집기 위해서 기다리는 상태가 된다. 

따라서 모든 철학자가 멈춰서 식사를 할 수 없다. 따라서 프로그램이 멈추는 Deadlock(교착 상태)가 된다.
-> n명중 1명 만 다른 방향의 포크를 집게 하면 풀린다.

'study > 앱프로그래밍' 카테고리의 다른 글

[app] Activity and Intent.txt  (0) 2020.07.30
[app] android.txt  (0) 2020.07.22