2011-11-15 2 views
1

전역 변수 인 정수형 클럭을 가진 클래스가 0으로 초기화되었습니다. 스레드를 시작하는 몇 개의 스레드 생성자에게 'clock'을 전달합니다. 그것은 'clock'이 스레드 내에서 볼 수있는 증가분 인 것처럼 보이지만 호출 프로세스에서 'clock'은 항상 0입니다. Integer가 객체이고 객체가 참조로 전달 되었기 때문에 'clock'의 변경 사항을 볼 수 있습니다. 어디에나. 그렇지 않은가요?쓰레드로 참조로 정수 전달하기

+1

Java는 * 값에 의한 전달 * - 구체적으로 * 참조 값 *입니다. 그것과는 별도로, 'Integer' (사실, 모든 autobox 클래스들)는 불변입니다; 너는 그것을 바꿀 수 없다. –

답변

5

를 사용하여 변경 가능한 Integer의 래퍼를 만드는 것입니다. 원자 적으로 갱신 될 수있다

int 값. 원자 변수의 특성에 대한 설명은 java.util.concurrent.atomic 패키지 스펙을 참조하십시오. AtomicInteger은 원자 적으로 증가하는 카운터와 같은 응용 프로그램에 사용되며 Integer 대신 사용할 수 없습니다. 그러나이 클래스는 Number을 확장하여 숫자 기반 클래스를 처리하는 도구와 유틸리티를 통해 일관된 액세스를 허용합니다.

+0

내가 모르는 다른 도서관이 존재했다. –

+1

도서관이 아닙니다. 그것은 Java SE의 일부입니다. –

0

Integer불변의 개체이므로 다른 스레드에서 해당 값을 변경할 수 없습니다. 그리고 스레드에서 사용할 때 final으로 선언해야하므로 변수를 재 할당 할 수 없습니다.

이 주위에 방법은 AtomicInteger 대신의 Integer

class MutableInteger { 
    private int integer; 

    synchronized void setInteger(int integer) { ... } 
    synchronized int getInteger() { ... } 
} 
+0

어, 깜빡 했어. 그러나 int 필드를 사용하여 Clock 객체를 만들고 increment()를 호출하면 올바르게 작동합니까? – Rooster

+0

예, 여러 스레드에서 쓰거나 읽는 경우 스레드 안전을 유지하려면'synchronized' 한정자를 사용해야합니다. –

+0

아, 그건 내 Clock 객체와 유사합니다. 감사! – Rooster

관련 문제