ThreadLocal类
try {
// 通过默认配置文件hibernate.cfg.xml创建SessionFactory
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
log.error("初始化SessionFactory失败!", ex);
throw new ExceptionInInitializerError(ex);
}
}
//创建线程局部变量session,用来保存Hibernate的Session
public static final ThreadLocal session = new ThreadLocal();
* 获取当前线程中的Session
* @return Session
* @throws HibernateException
*/
public static Session currentSession() throws HibernateException {
Session s = (Session) session.get();
// 如果Session还没有打开,则新开一个Session
if (s == null) {
s = sessionFactory.openSession();
session.set(s); //将新开的Session保存到线程局部变量中
}
return s;
}
//获取线程局部变量,并强制转换为Session类型
Session s = (Session) session.get();
session.set(null);
if (s != null)
s.close();
}
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-23
* Time: 10:45:02
* 学生
*/
public class Student {
private int age = 0; //年龄
return this.age;
}
this.age = age;
}
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-23
* Time: 10:53:33
* 多线程下测试程序
*/
public class ThreadLocalDemo implements Runnable {
//创建线程局部变量studentLocal,在后面你会发现用来保存Student对象
private final static ThreadLocal studentLocal = new ThreadLocal();
ThreadLocalDemo td = new ThreadLocalDemo();
Thread t1 = new Thread(td, "a");
Thread t2 = new Thread(td, "b");
t1.start();
t2.start();
}
accessStudent();
}
* 示例业务方法,用来测试
*/
public void accessStudent() {
//获取当前线程的名字
String currentThreadName = Thread.currentThread().getName();
System.out.println(currentThreadName + " is running!");
Random random = new Random();
int age = random.nextInt(100);
System.out.println("thread " + currentThreadName + " set age to:" + age);
Student student = getStudent();
student.setAge(age);
System.out.println("thread " + currentThreadName + " first read age is:" + student.getAge());
try {
Thread.sleep(500);
}
catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("thread " + currentThreadName + " second read age is:" + student.getAge());
}
//获取本地线程变量并强制转换为Student类型
Student student = (Student) studentLocal.get();
//线程首次执行此方法的时候,studentLocal.get()肯定为null
if (student == null) {
//创建一个Student对象,并保存到本地线程变量studentLocal中
student = new Student();
studentLocal.set(student);
}
return student;
}
}
thread a set age to:76
b is running!
thread b set age to:27
thread a first read age is:76
thread b first read age is:27
thread a second read age is:76
thread b second read age is:27
转载于:https://www.cnblogs.com/tmrcp/archive/2009/07/17/1525506.html
ThreadLocal类相关推荐
- 线程系列5--java中的ThreadLocal类实现线程范围内的数据共享(二)
ThreadLocal类可以理解成一个类似与map集合使用,以当前线程当做key 来使用,将线程氛围内需要共享的数据当做value,形成键值对的形式使用.ThreadLocal和线程同步机制都是为了解 ...
- ThreadLocal类与Synchonized对象锁的区别
对于多线程资源共享的问题,同步机制采用了"以时间换空间"的方式,而ThreadLocal采用了"以空间换时间"的 方式.前者仅提供一份变量,让不同的线程排队访问 ...
- java的ThreadLocal类的使用方法
java的ThreadLocal类的使用方法,ThreadLocal是一个支持泛型的类,用在多线程中用于防止并发冲突问题. 比如以下的一个样例,就是用于线程添加1,可是相互不冲突 package co ...
- 深入研究java.lang.ThreadLocal类
2019独角兽企业重金招聘Python工程师标准>>> 一.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而 ...
- ThreadLocal类的实现用法
ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为Thread ...
- 编写Java程序,使用ThreadLocal类,项目中创建账户类 Account,类中包括账户名称name、 ThreadLocal 类的引用变量amount,表示存款
查看本章节 查看作业目录 需求说明: 某用户共有两张银行卡,账户名称相同,但卡号和余额不同.模拟用户使用这两张银行卡进行消费的过程,并打印出消费明细 实现思路: 项目中创建账户类 Account,类中 ...
- 声明银行账户类 java_编写Java程序,使用ThreadLocal类,项目中创建账户类 Account,类中包括账户名称name、 ThreadLocal 类的引用变量amount,表示存款...
查看本章节 查看作业目录 需求说明: 某用户共有两张银行卡,账户名称相同,但卡号和余额不同.模拟用户使用这两张银行卡进行消费的过程,并打印出消费明细 实现思路: 项目中创建账户类 Account,类中 ...
- ThreadLocal类以及应用技巧
我们完全可以用ThreadLocal来完成线程范围内数据的共享. package com.learn.day05.demo05;import java.util.Random;public class ...
- ThreadLocal类学习笔记
这个类在java1.2中就出现了,线程独有的变量(每个线程都有一份变量),使用它的好处之一就是可以少传许多参数. 在哪里用到它呢?有连接池的地方就有它的身影,连接池包括数据库连接池,网络连接池等. i ...
最新文章
- android dialog
- python映射类型-什么是python中唯一的映射类型
- 如何加入IETF 如何发表自己的RFC
- 【RabbitMQ】2、心得总结,资料汇总
- 修改centos6.3启动级别以及启动级别配置错误的修改问题
- WPS Office 2019 For Linux 8722 发布,引入pdf组件
- Iperf 源代码分析(四)
- 【报告分享】2020技术趋势报告-德勤-202003.pdf(附120页pdf原文下载链接)
- 周爱民:真正的架构师是没有title的(图灵访谈)
- CVSNT Manual
- 提示microsoft incremental linker已停止工作解决方法
- [转载] python+selenium自动化软件测试(第3章):unittes
- mysql 查询建表详情_MySQL 查看数据表结构以及详情的方法
- 知识付费与内容付费的区别
- 第七届中国云计算大会在京盛大开幕
- linux环境vmd安装,Ubuntu下VMD安装
- tensorflow if语句
- Matlab安装失败问题
- 行人轨迹预测ETH数据集坐标转换
- 即构组局:线上娃娃机的这几个月,都经历了些什么?
热门文章
- metasploit 利用MS08-067渗透攻击xp系统全过程
- Java 编程开始啦
- 字符集 ISO-8859-1(1)
- 【BZOJ-2342】双倍回文 Manacher + 并查集
- 2015年第11本:代码整洁之道Clean Code
- Flex TextInput只允许输入数字等字符及字符数限制
- oracle 创建数据库 表空间 用户 授权和toad导入导出数据库
- Android selector 使用
- Android Stadio调试gradle 插件 || Android Stadio 远程调试 || Anroid APT调试
- android onLayout死循环