多线程与高并发(五)
一、ThreadLocal
在ThreadLocal中设置的值是当前线程独有的。往当前线程中设置的值只有当前线程可以访问
Thread.currentThread.map(ThreadLocal,对象)
每个线程往ThreadLocal中设置的值都是往当前线程的map中设置的,不同的线程设置值在不同的map中
二、java引用
1、强引用
只要有一个引用指向这个对象,垃圾回收器一定不会回收
2、软引用:做缓存用
有一个对象,有一个软引用指向这个对象。只有当系统内存不足时,垃圾回收才会回收该对象
3、弱引用:只要遭遇到gc就会被回收
用在ThreadLocal中:Thread.currentThread.set(this,value)。this是一个返回值类型为ThreadLocal的entry,entry的父类是一个弱引用,是通过弱引用指向ThreadLocal
如上图,如果entry不是返回值类型为ThreadLocal的弱引用,而是一个强引用,那么当ThreadLocal对象被回收后,this对象不会被回收,会造成内存泄漏(永远不会被回收)
当new出来的ThreadLocal对象被回收后,key为null,此时是get不到key为null的元素的value的,会造成内存泄漏
解决办法:当ThreadLocal对象不用后调用remove方法
4、虚引用
可以使用虚引用,清理堆外内存
三、AQS
1、AQS是JUC下的一个类,由一个voliate的int类型的state+双向队列组成
2、AQS的两种功能:排他锁和共享锁
排他锁:同一时间只允许一个线程获取锁资源,ReentrantLock
共享锁:同一时间允许多个线程获取锁资源,如CountDownLatch
3、AQS是基于双向队列和CAS的方式操作state的
CAS:compareAndSet
作者:http://cnblogs.com/lyc-code/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权力。