Java高并发的情况下如果出现共享变量,如何保证线程安全的解决方案

此文为我个人理解,如有不正确欢迎指正

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tornado是一个Python的Web框架,提供高性能的非阻塞网络IO,支持异步编程,能够很好地处理高并发的网络请求。而WebSocket是一种基于TCP协议的网络通信协议,与HTTP协议不同,WebSocket可以在客户端和服务器之间建立持久性的连接,实现双向实时通信。 在Tornado中,我们可以使用全局变量共享变量,也可以使用协程(Coroutine)来实现异步的变量共享。在WebSocket中,我们可以使用WebSocketHandler类来实现客户端和服务器之间的通信,并在类中定义成员变量共享变量。由于WebSocket是一种长连接,所以在客户端和服务器之间保持连接期间,这些成员变量会一直存在并且可被访问。 以下是一个简单的示例代码,展示了如何在Tornado和WebSocket中共享变量: ``` import tornado.ioloop import tornado.web import tornado.websocket # 全局变量 global_var = 0 # 定义WebSocketHandler类 class MyWebSocketHandler(tornado.websocket.WebSocketHandler): # 成员变量 member_var = 0 def open(self): print("WebSocket opened") # 共享全局变量 global global_var global_var += 1 # 修改成员变量 self.member_var += 1 def on_message(self, message): print("Received message: {}".format(message)) def on_close(self): print("WebSocket closed") # 定义HTTP请求处理类 class MainHandler(tornado.web.RequestHandler): def get(self): # 访问全局变量 global global_var self.write("Global variable: {}\n".format(global_var)) # 访问成员变量 ws = MyWebSocketHandler() self.write("Member variable: {}\n".format(ws.member_var)) # 定义应用程序对象 application = tornado.web.Application([ (r"/", MainHandler), (r"/ws", MyWebSocketHandler), ]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.current().start() ``` 相关问题: 1. 什么是Tornado? 2. 什么是WebSocket? 3. Tornado如何实现非阻塞网络IO? 4. WebSocket和HTTP有什么区别? 5. 如何在Python中使用协程?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值