Java高并发的情况下如果出现共享变量,如何保证线程安全的解决方案
2019-01-11 11:36
831 查看
此文为我个人理解,如有不正确欢迎指正
一、ThreadLocal
首先,我们简单的了解一下线程安全,简单的举例来说,当10个客户端同时请求同一个接口,这样就产生了10个线程,当这10个线程需要共享一个变量时,就可能出现脏读等线程安全问题。ThreadLocal便解决了这个问题。ThreadLocal会把每一个线程变量的值存储到本地,线程之间不共用数据,从而杜绝数据脏读等问题
private static ThreadLocal<String> t1=new ThreadLocal<String>(); //ThreadLocal通过set和get来存储和获取数据 if(t1 == null) { t1.set("变量值") } t1.get();
二、InheritableThreadLocal
ThreadLocal确实从一定程度上解决了线程安全的问题,但也有缺点,那就是父子线程之间不能进行值传递。我们先了解一下父子线程,按照我对业务上的理解,那便是一个接口请求另一个接口,第二个接口的线程是由第一个接口的线程引发的,第一个接口的线程则为第二个接口线程的父线程。InheritableThreadLocal为ThreadLocal的子类,(具体原理我这不细说了,请找相关文章)一定程度上解决了父子线程之间传值的问题,同样的,也是使用set和get来存储和获取数据
private static InheritableThreadLocal<String> t1=new InheritableThreadLocal<String>(); //父线程set值 if(t1 == null) { t1.set("变量值") } //子线程get值 t1.get();
但是,InheritableThreadLocal却没有完美解决父子线程间传值问题,当我们为了减小开销而使用线程池(作用:线程池会缓存已经使用过的线程)的时候,InheritableThreadLocal set的值没有清除,会导致第二次任务会得到第一次set的值,为了避免这种问题,阿里的TransmittableThreadLocal出现了
三、TransmittableThreadLocal
原理各位找一下官方文档吧
pom
<dependency> <groupId>com.alibaba</groupId> <artifactId>transmittable-thread-local</artifactId> <version>2.2.0</version> </dependency>
使用与InheritableThreadLocal差不多。
相关文章推荐
- 阿里Java面试题剖析:在高并发的情况下如何保证消息的顺序性?
- JAVA中如何保证线程安全以及主键自增有序
- 【Java之Servlet(二)】servlet是单例多线程,以及多线程下如何保证线程安全
- java一种极端情况下出现父类访问子类的实例变量的情况
- java并发之如何解决线程安全问题
- 在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)
- java中如何理解多个对象共享同一个静态成员变量(多个实例的static变量会共享同一块内存区域)
- SpringMVC是单例的,高并发情况下,如何保证性能的?
- Java利用happen-before规则如何实现共享变量的同步操作详解
- JAVA 并发编程-线程范围内共享变量(五)
- SpringMVC是单例的,高并发情况下,如何保证性能的?
- 在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)
- java 如果一个变量是double或者float,如何初始化为0?
- 1.2.3实例变量与线程安全(共享数据的情况)
- SpringMVC是单例的,高并发情况下,如何保证性能的?
- Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景
- Java里如何实现一个方法在不同情况下“返回”不同的类型变量?
- 2015我想和Java聊聊之StringBuffer是如何保证线程安全的
- java获取远程文件(保证文件的完整性,不会出现无法打开的情况)
- 从JDK源码角度看java并发的原子性如何保证