2013-02-10 4 views
0

나는 자바에이 코드를 변환 할 노력하고있어 나는 정말 바로 코드에 도달하기 위해 열심히 노력하고 있습니다은 상호 배제 코드

turn = 0 // shared control variable  
while (turn != i); 
// CS 
turn = (turn + 1) % n; 

을 구현하기 위해 스레드를 사용하지만이 실패 내 코드

입니다
/* 
* Mutual exclusion using thread 
*/ 
class gV{ 
int turn=0; 
} 

class newThread extends Thread{ 

    static int i; 
    int n=10; 
    newThread(gV obj){ 
    this.i=obj.turn; 
    start(); 
    } 

    public void run(){ 

    while(obj.turn!=i&&obj.turn<n); 
    criticalSection(i); 
    obj.turn=(obj.turn+1); 
    i++; 
    } 

    public void criticalSection(int numOfProcess){ 
    System.out.println("Process " + numOfProcess + " done!!"); 
    } 
} 

class MutualExclusion{ 
    public static void main(String args[]){ 
    gV obj = new gV(); 
    new newThread(obj); 
    } 
} 

제 코드에는 실수가 있습니다. 도와 주셔서 감사합니다!

+0

'synchronised' 또는 이것을 위해 존재하는 JDK의 많은 클래스 중 하나를 사용하는 대신 자신의 동기화 코드를 구현하는 이유가 있습니까? – millimoose

답변

4

AtomicInteger을 사용하십시오.

원자는 다른 스레드가 결과를 볼 수 있기 전에 모든 작업이 완전히 완료됨을 의미합니다. 의미는 당신이 두 가지 동시 작업을하지 않습니다 'clobber'. 예를 들어, 원자가 아닌 정수가 있고 두 개의 스레드가 동시에 값을 증가 시키려고하면 - 상수 값 1을 가졌고 둘 다 1로 읽은 다음 2로 설정하려고 시도한다고 상상하십시오. 둘 다 한 번씩 증가하지만 그 대신에 3이되면 2가됩니다! AtomicIntegerIncrementAndGet을 제공하여이 문제를 해결하므로 증가가 완료되기 전에 다른 스레드가 AtomicInteger의 값에 액세스 할 수 없습니다.

는 특히, 이러한 방법을 사용하십시오

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html#get()

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html#incrementAndGet()

당신이 그것을 증가 것을 알 수 있지만, 그것은 n 개의 모듈로하지 않습니다. 음, 값을 읽을 때마다 모듈화 할 수 있습니다. 그런 식으로 저장하지 않아도됩니다.

편집 :이 같은 방식으로 일을 뭔가 :

while (turn != i); 

는 바쁜 대기라고하고 CPU 사용량이 수천의 변수 수백을 확인, 100 % 수 있다는 것을 의미하기 때문에 나쁜 생각한다 초당 횟수. 이런 종류의 시나리오에서는 가능한 한 자주 각 스레드를 확인하는 대신 스레드를 실행을 계속할 때 다른 스레드가 스레드 waitnotify을 작성하려고합니다.

나는 상호 배제를 구현하기 위해 locksynchronized을 사용하는 자바를 믿는다. 무언가를 잠 그거나 동기화 된 블록을 입력하려고 시도했지만 이미 사용 중이면 스레드는 잠자기 상태가되고 차례가되면 깨어납니다. 그래서, 이것도 살펴볼 수 있습니다.