您的位置:首页 > 编程语言 > Java开发

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差不多。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐