对于下面的程序:
public class MyThread extends Thread{
private Object obj;
......
}
请问,这个MyThread里面的成员变量,是不是线程安全的?
因为,MyThread继承了Thread,其使用方式为:new MyThread().start();
所以,这就意味着,每次都是new了新对象,那么,他里面的各个成员变量就是这个对象自己拥有的,所以,是安全的。
我这样理解有问题吗?
PHPz2017-04-18 10:51:12
스레드 안전성이 다중 스레드에서 사용되는지 여부와 관련이 있는지
private
을 정의했지만 다른 스레드에서 간접적으로 접근할 수 있는 방법이 많기 때문에 다중 스레드에서 사용하는 것은 가능하지만 코드에 추가된 동기화 처리가 없으므로 안전하지 않습니다.
Thread와 Runnable을 사용하는 것에는 차이가 없습니다.
으아악케이스 없이 실행되는 예제(찾으려면 여러번 실행해야 함)
으아악ringa_lee2017-04-18 10:51:12
새로운 객체가 생성될 때마다 그 객체 내부의 지도는 해당 객체 자체의 소유이므로 안전합니다.
하위 스레드를 호출하는 메인 스레드에서 공용 멤버(변수)를 선언하고 하위 스레드 내부에서 공용 변수를 작동하거나 공용 변수를 참조로 전달하지 않는 한 이 문장은 정확합니다. 스레드 불안전 문제의 출현에 대해 맵 유형 자체가 스레드로부터 안전한지 여부도 잊어버렸습니다. (맵이 인터페이스라는 것을 기억합니다. 스레드로부터 안전한지 여부는 이에 따라 다릅니다. 그의 특정 구현에 대해서는) , Baidu에서 검색하실 수 있습니다. . .
맵 구현 자체가 스레드로부터 안전하다면 다중 스레드 내에서 어떻게 작동하더라도 괜찮을 것입니다. (메인 스레드에서 선언하고 하위 스레드를 참조하여 전달하는 경우에도)
구체적인 실 안전 과학 지식은 제가 이전에 쓴 글을 읽어보실 수 있습니다 https://zhuanlan.zhihu.com/p/...
PHPz2017-04-18 10:51:12
말하자면
여행 가방에 돈을 넣고 혼자 길을 걷는다.
당연히 안전하다고 생각하시겠죠.
하지만 한번 도둑맞으면 안전하지 않습니다. . .
스레드 안전성은 서로 다른 스레드가 동일한 데이터에 액세스한다는 것을 의미합니다. 스레드가 하나만 있으면 스레드 안전성이 없습니다. 또는 "안전"하다고 이해할 수도 있습니다. 결국 다른 개체는 이에 액세스할 수 없지만 "스레드 안전"은 아닙니다.
질문에 답하세요:
이 지도 객체는 스레드에 안전하지 않습니까?
예, 스레드가 안전하지 않습니다.
여기의 각 Thread 개체에는 고유하고 독립적인 Map 개체가 있지만 "스레드 안전 기능"이 없기 때문입니다.
글쎄요, 제가 이해한 내용은 좀 장황한 것 같습니다. . . ==
迷茫2017-04-18 10:51:12
읽는 것은 괜찮지만, 쓰면 스레드 안전 문제가 발생할 수 있습니다. . .
1. 스레드로부터 안전한 클래스 메서드를 사용하세요
2. ThreadLocal을 사용하세요
PHPz2017-04-18 10:51:12
MyThread
를 클래스라고 생각하고(스레드 클래스라고 생각하지 마세요) obj
를 이 클래스의 멤버라고 생각하세요. 그러면 이해가 더 쉬워집니다.
PHPz2017-04-18 10:51:12
주로 특정 공개 리소스에 액세스했는지 여부에 따라 다릅니다. 이 질문은 특정 공개 리소스에 액세스하는 것과 관련이 없으므로 안전하거나 안전하지 않다고 말할 수 없습니다.