2017-02-17 1 views
0

저는 자바를 사용하여 게임을 만들고 있습니다. 한 번에 다른 클래스를 초기화하는 클래스를 초기화하는 스레드를 만듭니다. 활성화되어 있지 않으면 내 메인 스레드가 초기화 한 클래스에 액세스하고 다른 스레드에서 초기화 한 변수를 사용하는 메소드를 호출합니다. 다른 스레드의 메소드는 다른 스레드에 의해 초기화 된 변수를 가지고 있습니다.멀티 스레딩 - 휘발성 키워드를 사용하지 않고 변수를 초기화해야하는 이유는 무엇입니까

내 질문은, 원한다면 다른 클래스의 무리에있는 별도의 스레드를 사용하여 많은 변수를 초기화하려면 휘발성을 초기화하는 모든 변수를 만들거나 해당 스레드를 사용하여 초기화하는 모든 변수가 자동으로 생성되도록 더 좋은 방법이 필요합니까? 접근 가능한 다른 스레드에 의해.

이 질문은 휘발성 키워드를 사용해야하지 않습니다. 휘발성 키워드를 사용하지 않아야하며, 많은 변수를 휘발성으로 만드는 더 좋은 옵션이 있습니다.

또한 도움이된다면 내 프로그램에는 객체 지향 구조가 있습니다.

+0

변수를 초기화하는 데 별도의 스레드를 사용하는 이유는 무엇입니까? – Kayaman

+0

초기화하는 데이터를로드하는 데 약간의 시간이 걸리며 프로그램이 로딩 화면과 같은 종류의로드하는 동안 몇 가지 다른 것을 렌더링하려고합니다. – retodaredevil

+1

아니요, 모든 변수를 휘발성으로 만들어서는 안됩니다. 대신 로딩 스크린 애니메이션을위한 별도의 스레드를 만들고 초기화가 준비되면 스레드를 중지하고 정상적으로 계속 진행할 수 있습니다. 이제 당신은 조금 뒤로 가야합니다. – Kayaman

답변

0

volatile 키워드를 사용하는 것에 대해 혼란 스럽습니다. 다른 스레드에서 변수를 볼 수있게하려면 volatile 키워드를 사용하지 마십시오. volatile은 변수에 대한 쓰기와 그 변수의 후속 읽기 사이에 발생하기 전에 관계를 설정하는 데 사용됩니다. 이는 CPU 캐시에서 변수를 읽는 대신 변수가 읽힐 때마다 주 메모리에서 변수를 읽도록 강제함으로써 수행됩니다.

개체 또는 개체의 요소를 다른 스레드에 표시하려면 특별한 작업을 수행 할 필요가 없습니다.

+0

* "다른 스레드가 변수를 볼 수있게하려면 volatile 키워드를 사용하지 마십시오."* ... 그런데 이것이 바로 'volatile'키워드를 사용하는 이유입니다. '휘발성'변경자는 가시성을 제공함으로써 스레드 안전성의 약한 형태를 제공하지만 그 자체로 원 자성 또는 상호 배제에 대한 아무 것도 제공하지 않습니다. 따라서 '휘발성'은 객체 상태가 실제로 존재할 때 실제로 발생하기 전에 관계를 보장 할 수 없습니다. 하나 이상의 필드로 구성됩니다. – scottb

+0

* "다른 스레드에서 객체 나 요소를 볼 수있게하려면 특별한 작업을 수행 할 필요가 없습니다."* ... 이것은 irretrievably and inarguably false입니다. – scottb

+0

@scottb'volatile'은 필드의 가시성을 다른 스레드에 제공하지 않습니다. 이 변수는 _changes_에 대한 가시성을 다른 스레드에 제공합니다. 여기서 말하는 내용을 백업 할 수있는 링크를 제공 할 수 있습니까? – Neatname

관련 문제