2014-01-17 2 views
1

정수를 인수로 받아들이고 콘솔에 인쇄하는 방법을 만듭니다. 이 메소드는 다중 스레드에 의해 액세스됩니다. 2 개 이상의 thread가 같은 값을 가지는 메소드를 호출하면 (자), 1 개의 thread만이 다른 thread가 대기하는 값을 인쇄 할 수있게 할 필요가 있습니다. 값이 다른 경우 모든 스레드가 값을 인쇄 할 수 있어야합니다. 인턴은 여기서 도움이 될 거라는 걸 알지만 자바 인턴은 128보다 작은 값까지 발생합니다. 그 후 동일한 값을 갖는 두 정수가 다른 대상입니다 ... 할 수 있습니까? 조건에 동기화를위한 모든 조항 ??조건에 따른 Java 동시성

+1

코드는 어디에 있습니까? –

+0

'.. 다른 스레드는 무엇까지 기다려야합니까? – JVMATL

+0

* 조건에 따라 동기화하지 않습니다. - 개체를 동기화 한 다음 조건에 맞는 지 여부에 따라 개체의 값에 따라 동기화 된 블록 내에서 논리를 수행합니다. 그러나이 모든 질문은 매우 불명확합니다. 예를 들어, 한 스레드가 '4'로 전화를 걸면 1 분 후에 '4'로 다른 전화가 오면 어떻게 될까요? 어떤 일이 일어나야 하는지를 이해할 때까지 (그리고 설명 할 수있을 때까지), 당신을 도울 수 없습니다. 각 값은 한 번만 인쇄 할 수 있습니까? 그렇다면 호출 스레드는 어떻게됩니까? 그들은 영원히 차단합니까? – JVMATL

답변

1

같은 값을 인쇄에서 여러 스레드를 방지하지만, 그들이 다른 사람

이 문제를 방지하는 가장 간단한 방법은 인쇄 허용에 대한 요구 사항은 이미 인쇄 된 정수의 집합을하는 것입니다. 당신이 자물쇠를 사용하는 오버 헤드를 인쇄하기 때문에 사소한 것입니다.

Set<Integer> printed = Collections.synchronizedSet(new HashSet<Integer>()); 

// when printing 
if (printed.add(num)) // will one be true the first time for each number 
    System.out.println("num: " + num); 
는 는

은 수행 할 수 있습니다

?

콘솔에 대한 인쇄는 이미 동기화되어 있으며 작업 내용에 관계없이 모든 스레드가 사용자의 작업과 관계없이 인쇄 작업을 동기화합니다. 잠금을 더 추가해도 변경되지 않습니다.

System.out을 구현하고 당신은 단순히 여기에 발신자에서하여 synchronized을 무시하도록 결정할 수 없습니다

public void println(String x) { 
    synchronized (this) { 
     print(x); 
     newLine(); 
    } 
} 

을 잘못의 PrintStream에서.

조건에 동기화하기위한 모든 조항 ??

가장 간단한 방법은 다른 잠금 또는 로컬 스레드를 잠그는 것입니다. uncontented 오브젝트를 잠그는 것은 매우 빠릅니다.

synchronized(shared ? sharedObject : Thread.currentThread()) { 

} 

기타 이것은 매우 이상하거나 혼란스러운 일입니다. 나는 심각하게 설계 변경을 고려할 것이므로 필요하지 않습니다. 일반적인 멀티 스레드 코드를 작성하는 것은 쓰기/이해하기에 충분히 어렵습니다.

+1

나는이 질문이 그가 묻고있는 것에 대해 꽤 대답 할 것이라고 생각하지 않는다. (질문은 꽤 모호하지만, 나는 무엇이 질문 당하고 있는지 확신 할 수 없다.) -이 답변은 다중 스레드가 * 동일한 * 값을 인쇄하지 못하도록하는 요구 사항을 어떻게 해결합니까? 이상한 묘사에도 불구하고, 그것은 질문의 중요하고 중요한 부분처럼 들립니다. – JVMATL

+0

@JVMATL 동시에 여러 개의 스레드를 인쇄 할 수 없습니다. System.out이 이미 동기화되었으므로 쉽게 동기화 할 수 없으며 원할 수도 없습니다. –

+1

System.out은 동기화되어 있지만 사용자의 설명에 따르면 System.out에서 인터리빙 출력을 막기 위해 동기화하는 것이 실제로 그의 질문의 요지입니다. 그는 다른 값으로 호출되는 경우 '동일한 값'으로 메소드를 호출하면이 메소드를 호출하는 방법이 다른지를 묻는 것처럼 보입니다. 그가 관심을 갖는 것이 인쇄물의 인터리빙을 방해하는 것이라면 왜 그 값이 같은지 또는 다른지를 언급 ​​할 것입니까? (그리고 아니오, 그가 무엇을하고 싶은지 알아낼 수 없다) – JVMATL