[Java学习笔记]ThreadLocal实现不同线程的数据隔离,同一线程的数据共享

ThreadLocalThreadLocal是什么?ThreadLocal的用法(存在意义)一、同一线程内共享数据二、不同线程实现数据隔离ThreadLocal实现机制ThreadLocal是什么?早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。当...
摘要由CSDN通过智能技术生成

ThreadLocal是什么?

早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。

当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。

对比Synchronized,我们就能更好的理解——Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离

ThreadLocal的用法(存在意义)

一、同一线程内共享数据

一般的Web应用划分为展现层、服务层和持久层三个层次,在不同的层中编写对应的逻辑,下层通过接口向上层开放功能调用。在一般情况下,从接收请求到返回响应所经过的所有程序调用都同属于一个线程,如图所示:
在这里插入图片描述

同一线程贯通三层这样你就可以根据需要,将一些非线程安全的变量以ThreadLocal存放,在同一次请求响应的调用线程中,所有关联的对象引用到的都是同一个变量。

例如下面这个例子:
我需要在执行完毕的时候对事物提交,发生异常的时候对事务进行回滚,那么就要求我们进行提交/回滚的Connection连接和执行增删查改的连接是同一个——即一个事务一个连接,问题在于,我们获取连接的方式如果是通过连接池(DataSource)来完成,那么每次获取的连接都不一定是相同的!

    @Before
    public void before(){
   
        ad = new AccountDaoImp();
    }
    @Test
    public void transfer(){
   
        Connection conn = DataSourceUtils.getConnection();
        try {
   
            conn.setAutoCommit(false);
            ad.decreaMoney(2, 2000);
            int a = 1/0;
            ad.increaMoney(1,2000);
            conn.commit();
        } catch (SQLException e) {
   
            try {
   
                conn.rollback();
            } catch (SQLException e1) {
   
                e1.printStackTrace
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值