关于java的多线程的成员变量是否线程安全的疑问?
大家讲道理
大家讲道理 2017-04-18 10:49:12
0
14
1519

对于下面的程序:

public class MyThread extends Thread{
    private Object obj;
    ......
}

请问,这个MyThread里面的成员变量,是不是线程安全的?

因为,MyThread继承了Thread,其使用方式为:new MyThread().start();
所以,这就意味着,每次都是new了新对象,那么,他里面的各个成员变量就是这个对象自己拥有的,所以,是安全的。
我这样理解有问题吗?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

모든 응답(14)
PHPzhong

스레드 안전성이 다중 스레드에서 사용되는지 여부와 관련이 있는지

private을 정의했지만 다른 스레드에서 간접적으로 접근할 수 있는 방법이 많기 때문에 다중 스레드에서 사용하는 것은 가능하지만 코드에 추가된 동기화 처리가 없으므로 안전하지 않습니다.

보충제

Thread와 Runnable을 사용하는 것에는 차이가 없습니다.

으아악

케이스 없이 실행되는 예제(찾으려면 여러번 실행해야 함)

으아악
左手右手慢动作

새로운 객체가 생성될 때마다 그 객체 내부의 지도는 해당 객체 자체의 소유이므로 안전합니다.

하위 스레드를 호출하는 메인 스레드에서 공용 멤버(변수)를 선언하고 하위 스레드 내부에서 공용 변수를 작동하거나 공용 변수를 참조로 전달하지 않는 한 이 문장은 정확합니다. 스레드 불안전 문제의 출현에 대해 맵 유형 자체가 스레드로부터 안전한지 여부도 잊어버렸습니다. (맵이 인터페이스라는 것을 기억합니다. 스레드로부터 안전한지 여부는 이에 따라 다릅니다. 그의 특정 구현에 대해서는) , Baidu에서 검색하실 수 있습니다. . .

맵 구현 자체가 스레드로부터 안전하다면 다중 스레드 내에서 어떻게 작동하더라도 괜찮을 것입니다. (메인 스레드에서 선언하고 하위 스레드를 참조하여 전달하는 경우에도)

구체적인 실 안전 과학 지식은 제가 이전에 쓴 글을 읽어보실 수 있습니다 https://zhuanlan.zhihu.com/p/...

PHPzhong

말하자면
여행 가방에 돈을 넣고 혼자 길을 걷는다.
당연히 안전하다고 생각하시겠죠.
하지만 한번 도둑맞으면 안전하지 않습니다. . .

스레드 안전성은 서로 다른 스레드가 동일한 데이터에 액세스한다는 것을 의미합니다. 스레드가 하나만 있으면 스레드 안전성이 없습니다. 또는 "안전"하다고 이해할 수도 있습니다. 결국 다른 개체는 이에 액세스할 수 없지만 "스레드 안전"은 아닙니다.

질문에 답하세요:

이 지도 객체는 스레드에 안전하지 않습니까?

예, 스레드가 안전하지 않습니다.
여기의 각 Thread 개체에는 고유하고 독립적인 Map 개체가 있지만 "스레드 안전 기능"이 없기 때문입니다.
글쎄요, 제가 이해한 내용은 좀 장황한 것 같습니다. . . ==

小葫芦

초대해주셔서 감사합니다!
의 사용을 new MyThread().start()으로 제한할 때 线程安全입니다.

迷茫

비공개로 선언하더라도 변수는 다른 스레드에서 계속 읽을 수 있습니다. 동기화 잠금이 없으면 스레드가 안전하지 않습니다.

으아아아
迷茫

읽는 것은 괜찮지만, 쓰면 스레드 안전 문제가 발생할 수 있습니다. . .

1. 스레드로부터 안전한 클래스 메서드를 사용하세요

2. ThreadLocal을 사용하세요

PHPzhong

MyThread를 클래스라고 생각하고(스레드 클래스라고 생각하지 마세요) obj를 이 클래스의 멤버라고 생각하세요. 그러면 이해가 더 쉬워집니다.

伊谢尔伦

멀티스레딩의 경우

으아악
PHPzhong

주로 특정 공개 리소스에 액세스했는지 여부에 따라 다릅니다. 이 질문은 특정 공개 리소스에 액세스하는 것과 관련이 없으므로 안전하거나 안전하지 않다고 말할 수 없습니다.

洪涛

주로 이 변수에 대해 작업을 수행했는지 여부에 따라 달라지며, 매번 새 객체를 생성한다고 가정하면 스레드로부터 안전합니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿