제네릭을 사용하여 객체의 ArrayList를 만듭니다. 각 스레드는 배열 목록에 객체를 계산하고 저장합니다.Java ArrayList 참조
그러나 static 및 volatile 인 ArrayList를 보면 모든 객체 속성이 null로 설정됩니다. 내 생각은 가비지 수집기가 스레드의 인스턴스를 제거하는 것과 관련이 있으므로 스레드가 완료되면 거기에 대한 참조가 없습니다.
도움이 될만한 정보가 있습니까?
제네릭을 사용하여 객체의 ArrayList를 만듭니다. 각 스레드는 배열 목록에 객체를 계산하고 저장합니다.Java ArrayList 참조
그러나 static 및 volatile 인 ArrayList를 보면 모든 객체 속성이 null로 설정됩니다. 내 생각은 가비지 수집기가 스레드의 인스턴스를 제거하는 것과 관련이 있으므로 스레드가 완료되면 거기에 대한 참조가 없습니다.
도움이 될만한 정보가 있습니까?
가비지 수집기는 배열 목록에서 인스턴스를 제거하지 않습니다. 그것은 문제가 아닙니다.
문제는 대개 사용자가 적절한 동기화를하지 않고 배열 목록 개체에 액세스하고 업데이트하는 것입니다. 제대로 동기화하지 않으면 한 스레드가 다른 스레드의 변경 사항을 항상 보지는 않습니다.
ArrayList
개체에 대한 참조를 선언하면 스레드에 동일한 목록 개체 참조가 표시됩니다. 그것은리스트 객체에 대한 연산에 어떤 일이 일어나는지 보장하지 않습니다.
- 1 GC 실행은 다음 적절리스트에 추가 된 모든 소자는 도달 될 때 어레이리스트 도달이라고 가정. 에 도달 할 수있는 값이 인 항목은 가비지 수집기에서 삭제되지 않습니다. 게다가 GC는 응용 프로그램이 여전히 볼 수있는 객체에 도달하지 않으며 null
에 대한 일반적인 참조를 변경합니다.
몇 가지 예제 코드를 게시 할 수 있습니까? – pablochan
가비지 컬렉터는 결코 변수를 "null"하지 않거나 객체를 변경합니다. 'null'의 값은 명시 적으로 할당되었거나 디폴트 값입니다. 이제 여러 스레드에서 ArrayList를 사용하는 것은 본질적으로 문제가됩니다. 적어도 "synchronized"를 사용하지 않아도됩니다. – user2864740
생각이 잘못되었습니다. –