多线程与高并发(五)

一、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

 

posted @ 2022-04-11 17:19  showMeTheCodes  阅读(35)  评论(0编辑  收藏  举报