94 threadlocal

2021-06-27  本文已影响0人  滔滔逐浪

1、threadlocal提供了线程本地变量。塔克哟保证访问到的变量属于当前线程,每个线程都保存了一个变量副本,每个线程的变量都不相同。ThreadLocal相当于提供了一种线程隔离,将变量和线程相互绑定。
ThreadLocal适用于走啊多线程的情况下,可以哦实现传递数据,实现线程隔离。

ThreadLocal 提供给我们每个线程缓存局部变量‘
ThreadLocal 基本API
1,New ThreadLocal();----创建Threadlocal
2,set 设置当前线程绑定的局部变量、
3,get获取当前线程绑定的局部变量
4,remove()。移除当前线程绑定的局部变量;

Threadlocal应用场景:
1,spring事务模板类:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
2,获取httpresquest;
HttpServletRequest request=((ServletRequestAttributes)(RequestContextHolder.currentRequestAttributes())).getRequest();

什么是内存溢出:
指程序在申请内存时,没有足够的内存空间提供其使用,出现out of memory。OOM溢出,程序申请内存时,没有足够内存空间使用,一般解决方法: 加内存。
什么是内存泄漏
值程序在申请内存后,无法释放已申请的内存空间,内存泄漏会导致内存被占光,造成系统内存浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

强,软,弱,虚引用。
1,强引用: 当内存不足时,JVM开始进行GC(垃圾回收),对于强引用对象,就算是出现了OOM也不会对该对象进行回收,死都不呼呼回收;
2,软引用: 当系统内存充足的时候,不会被回收;当系统内存不足时,他会被回收,runaway引用通常用在对内存敏感的程序中,比如告诉缓存就用到runaway引用,内存足够时候就保留,不够的时候就回收。

3,弱引用: 弱引用需要用到java.lang.ref.WeakReference类来实现,他比软引用的生存周期更短,对于只有弱引用的对象来说,只要有垃圾回收,不管jvm的内存空间够不够用,都会回收该对象占用的内存空间。

如何避免ThreadLocal 内存泄漏问题
1,可以自己调用remove方法将不要的数据移除避免内存泄漏的问题
2,每次在做set方法的时候会清除以前的key为null
3,Threadlocal对象为弱引用。

volatile 为了保证数据的可见性,但是不能保证原子性,及时的将工作内存的数据刷新主内存中,导致其他的工作内存的数据变为无效的状态,洽谈工作内存做的count++操作等于无效丢失
1,线程解锁前,必须把共享变量的最新值刷新到主内存中;
2,线程加锁时,将清空工作内存中的共享变量的值,从而使用共享变量是需要从主内存中重新读取最新的值(加锁和解锁需要同一把锁)

volatile是java提供的轻量级的同步机制,保证了可见性,不保证原子性
java语言包含内在的同步机制,同步快(或方法)和volatile变量,相比于synchronized(synchronized通常被称作重量级锁),volatile更轻量级,因为他不会引起线程上下文的切换和调度但是volatile变量的同步性能差(有时他更简单并且开销低),而且使用也容易出错

上一篇 下一篇

猜你喜欢

热点阅读