2014-11-22 3 views
1

제네릭을 사용하여 객체의 ArrayList를 만듭니다. 각 스레드는 배열 목록에 객체를 계산하고 저장합니다.Java ArrayList 참조

그러나 static 및 volatile 인 ArrayList를 보면 모든 객체 속성이 null로 설정됩니다. 내 생각은 가비지 수집기가 스레드의 인스턴스를 제거하는 것과 관련이 있으므로 스레드가 완료되면 거기에 대한 참조가 없습니다.

도움이 될만한 정보가 있습니까?

+2

몇 가지 예제 코드를 게시 할 수 있습니까? – pablochan

+0

가비지 컬렉터는 결코 변수를 "null"하지 않거나 객체를 변경합니다. 'null'의 값은 명시 적으로 할당되었거나 디폴트 값입니다. 이제 여러 스레드에서 ArrayList를 사용하는 것은 본질적으로 문제가됩니다. 적어도 "synchronized"를 사용하지 않아도됩니다. – user2864740

+0

생각이 잘못되었습니다. –

답변

2

가비지 수집기는 배열 목록에서 인스턴스를 제거하지 않습니다. 그것은 문제가 아닙니다.

문제는 대개 사용자가 적절한 동기화를하지 않고 배열 목록 개체에 액세스하고 업데이트하는 것입니다. 제대로 동기화하지 않으면 한 스레드가 다른 스레드의 변경 사항을 항상 보지는 않습니다.

ArrayList 개체에 대한 참조를 선언하면 스레드에 동일한 목록 개체 참조가 표시됩니다. 그것은리스트 객체에 대한 연산에 어떤 일이 일어나는지 보장하지 않습니다.


- 1 GC 실행은 다음 적절리스트에 추가 된 모든 소자는 도달 될 때 어레이리스트 도달이라고 가정. 에 도달 할 수있는 값이 인 항목은 가비지 수집기에서 삭제되지 않습니다. 게다가 GC는 응용 프로그램이 여전히 볼 수있는 객체에 도달하지 않으며 null에 대한 일반적인 참조를 변경합니다.