您的位置:首页 > 其它

答疑学员关于垃圾回收线程安全问题…

2015-12-24 16:21 696 查看
对了。。。突然灵感来了。。。估计今天说那个单利问题生命周期没说的很明白
00:25:16
静态成员变量的生命周期跟类的字节码生命周期一样。。。
00:27:39

如果要回收静态的成员变量的对象,也就意味着要把当前类的字节码文件对象给卸载回收,而回收类的字节码文件对象的条件是没人去使用这个类,并且加载这个类的类加载器也背回收,因此根本就不需要中获取的时候去创建对象,想想看,都有人使用当前工具类了,说明当前工具类的生命周期继续,因此对象也是存在的
00:28:13
或者说静态成员变量实例跟类的生命周期一致
00:29:15
如果你是个非静态成员变量,也就是普通的成员变量,他的生命周期是对象的生命周期。。。
00:31:07

因此你如何能调用获取当前实例的方法?必须通过对象去调用(静态方法是不能调用或者引用非静态方法的),如果能调用当前方法,说明对象是存在的,没有被gc回收
00:31:35
估计这样是不是就更容易理解了。。。
09:52:58

也就是说静态成员变量的生命周期是和类的字节码生命周期是一样的.所以只要类存在,这个静态变量就存在,静态变量存在,其指向的对象的引用也就存在,所以这个对象是一直有引用的.所以不会被回收
09:54:00
这个垃圾回收对象的时候,何时被回收判断的标准是不是就是当前对象是否还有引用?如果没有引用,就会被回收的.?
09:55:56

而且,在多线程访问的时候,静态成员变量指向的对象在new实例的时候,jvm也会保证线程安全的,不存在这个对象正在创建还没有创建成功返回引用,而另一个线程就开始使用这个静态引用的情况?
10:09:22
首先说第一个问题:  判断某个对象是否要被回收就看他的生命周期是否还存在...
10:10:33
比如类中的某个方法中创建的对象...方法执行完了.生命周期就结束了,或者换句话说他跟gc roots
对象之间的关联关系不存在..因此被标识为垃圾,所以被回收 
10:11:24
第二个就是变量的初始化顺序.类加载的时候顺序是这样的
10:11:43
先执行静态代码块,然后是静态成员初始化
10:12:03
当有对象创建的时候,先走构造代码块,然后再走构造函数 
10:13:20

因此静态变量的创建时机是类加载的时候,回收的时机是类的字节码回收的时候,因此我们才说静态成员变量的生命周期和类的字节码生命周期一致,静态成员变量也叫类对象 
10:14:47
另外一个问题就是线程安全问题:
线程安全问题的本质是多个线程对于临界资源的访问是否安全,临界资源在java中表现的就是静态变量,成员变量.
 因此方法中的参数,方法中的变量和对象根本就不存在线程安全问题
10:15:20
因为方法内部是每个线程都有自己的一段内存空间,不存在线程安全问题
10:16:06
静态变量/成员变量存在线程安全问题,所以之前我才说要使用JDK1.5并发库去防止这些问题.
10:16:46
同时单例设计模式的线程安全问题只存在于懒汉式设计模式情况下,及延迟加载的情况才可能出现.
10:17:20
饿汉式单例是不存在所谓的线程安全问题的. 
10:20:41
恩恩
最后,刚才又想到一点,如果说某个类的成员变量何时被回收? 就是当前类对象的所有对象都被回收了,
也就是跟gc root 对象失去了联系.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: