idea离线安装 定义键盘快捷键 webserver shiny hyperlink cuda vue router vue开发 后台页面模板 java设计模式视频 access教学视频 手机banner常用尺寸 coreldraw入门学习 wordpress本地建站 linux启动数据库 python的数据类型 python高级 linux配置python环境 java时间 java的数据结构 java开发学习 java索引 java输出当前时间 java安装教程 java连接mysql的jar包 tar文件怎么打开 音频录制软件 js上传图片 maxtoc4d 微信小程序源代码 mysql时间比较 拼多多商家下载 asp编程 开源即时通讯软件 js递归函数 hdcp是什么 黑域使用教程 地图数据采集 删除mysql服务 wps脚注
当前位置: 首页 > 学习教程  > 编程语言

ThreadLocal的使用与如何使用ThreadLocal去管理事务

2020/11/24 10:17:21 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

ThreadLocalThreadLocal的使用Filter和ThreadLocal组合管理事务ThreadLocal管理事务实现原理Filter与ThreadLocal组合管理事务ThreadLocal的使用 ThreadLocal 的作用:它可以解决多线程的数据安全问题。 ThreadLocal 它可以给当前线程关联一个数据(一个value)(可以是…

ThreadLocal

  • ThreadLocal的使用
  • Filter和ThreadLocal组合管理事务
    • ThreadLocal管理事务实现原理
    • Filter与ThreadLocal组合管理事务

ThreadLocal的使用

ThreadLocal 的作用:它可以解决多线程的数据安全问题。
ThreadLocal 它可以给当前线程关联一个数据(一个value)(可以是普通变量,可以是对象,也可以是数组,集合),此数据只能在当前线程中获取。
ThreadLocal 的特点:

  1. ThreadLocal 可以为当前线程关联一个数据(一个value)。(它可以像Map 一样存取数据,key为当前ThreadLocal实例)
  2. 每一个ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要使用多个ThreadLocal 对象实例。
  3. 每个ThreadLocal 对象实例定义的时候,一般都是static 类型
  4. ThreadLocal 中保存数据,在线程销毁后。会由JVM 虚拟自动释放

:在线程池中使用ThreadLocal后需要手动remove否则会造成内存泄露问题。

public class ThreadLocalTest {
//    public static Map<String,Object> data = new Hashtable<>();
    //该泛型类型就是value值的泛型
    public static java.lang.ThreadLocal<Object> threadLocal = new ThreadLocal<>();
    private static Random random = new Random();

    public static class Task implements Runnable{
        @Override
        public void run() {
            //在Run方法中,随机生成一个变量(线程要关联的数据),然后以当前线程名为key保存到map中
            int i = random.nextInt(1000);//0-999
//获取当前线程名
            String name = Thread.currentThread().getName();
            System.out.println("线程["+ name +"]生成的随机数是" + i);
//            data.put(name,i);

            threadLocal.set(i);

//            threadLocal.set("abc");会覆盖之前的value 只能保存一个值

            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //在外部方法中获取threadlocal实例的值看是否一样
            OrderService orderService = new OrderService();
            /*
            * public void createOrder(){
                String name = Thread.currentThread().getName();
                System.out.println("OrderService当前线程[" + name + "]中保存的数据为:" + ThreadLocalTest.threadLocal.get());
              }
            * */
            orderService.createOrder();
            
            //在run方法结束之前,以当前线程名获取出数据,查看是否可以取出操作。
//            Object o = data.get(name);

            Object o = threadLocal.get();

            System.out.println("在线程[" + name + "]快结束时取出关联的数据是:" + o);
        }
    }

    public static void main(String[] args){
        for (int i = 0;i < 3 ;i++){
            new Thread(new Task()).start();
        }
    }
}

Filter和ThreadLocal组合管理事务

ThreadLocal管理事务实现原理

要确保所有操作都在一个事务内,就必须要确保,所有操作都使用同一个Connection连接对象。

我们可以使用ThreadLocal对象。来确保所有操作都使用同一个Connection对象,将Connection对象保存在ThreadLocal对象中。
即:new ThreadLocal().set(new Connection);

ThreadLocal要确保所有操作都使用同一个Connection连接对象
那么操作的前提条件是所有操作都必须在同一个线程中完成

Filter与ThreadLocal组合管理事务

使用Filter过滤器给所有的Service方法都加上try-catch。来进行实现的
管理。

给所有工程下的文件加上Filter过滤器。

把异常全部抛给Filter,Filter再抛给Tomcat服务器。这样我们可以设置一些友好的提醒页面。

throw new RuntimeException(e);

提醒页面XML配置信息:

<filter>
	<filter-name>TransactionFilter</filter-name>
	<filter-class>com.atguigu.filter.TransactionFilter</filter-class>
</filter>

<filter-mapping>
	<filter-name>TransactionFilter</filter-name>
	<!-- / * 表示当前工程下所有请求-->
	<url-pattern>/ *</url-pattern>
</filter-mapping>

Filter与ThreadLocal管理事务具体代码就不附了。


本文链接: http://www.dtmao.cc/news_show_400241.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?