对于下面的程序:
public class MyThread extends Thread{
private Object obj;
......
}
请问,这个MyThread里面的成员变量,是不是线程安全的?
因为,MyThread继承了Thread,其使用方式为:new MyThread().start();
所以,这就意味着,每次都是new了新对象,那么,他里面的各个成员变量就是这个对象自己拥有的,所以,是安全的。
我这样理解有问题吗?
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
线程安全与否和是否在多个线程中使用有关
虽然你定义的是
private,但有很多种方法都可以在其它线程中间接的访问到它,所以它存在在多个线程中使用的可能,但是代码里又没有加入同步处理,所以它是不安全的。补充
使用 Thread 和 Runnable 并没有什么不同:
一个不案例的运行示例(要多运行几次才遇得到)
怎么说呢,这就好比:
你把钱装在了手提箱里,一个人走在街上。
你觉得这是安全的,当然了。
但是一旦被抢,就不安全了。。。
线程安全说的是不同线程访问同一个数据,如果只存在一个线程,就谈不上什么线程安不安全。或者你也可以理解为是“安全”的,毕竟没有其他对象来访问,但是不是“线程安全”
回答一下问题:
是的,线程不安全。
因为虽然这里每个Thread对象都拥有唯一独立的Map对象,可是却没有“线程安全的能力”。
嘛,我的理解就是这样的,好像有点啰嗦了。。。==
谢邀!
在限定使用方式为
new MyThread().start()的情况下是线程安全的。虽然你声明的private但还是可以在另一个线程里读取该变量,在没有加同步锁的情况下就是线程不安全的。
读没问题,写会出现线程安全问题。。。
1、用线程安全的类方法
2、用ThreadLocal
把
MyThread只是看成一个类(别想它是一个线程类),把obj只是看成这个类的成员。然后就好理解了。在多线程的情况下
主要看你有没有访问某一个公共资源,lz这个问题,没有涉及到访问某个公共资源,所以谈不上安全不安全。
主要是看你有木有对这个变量进行操作,而且假设你每次都是new一个对象出来,就是线程安全的。
线程安全的概述是指当多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果。
判断多线程的安全可以从以下三点分析:
如果多个线程操作一个共享数据,就要考虑线程安全问题。