- 浏览: 1251138 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (729)
- Java_about (144)
- Spring_Hibernate_Struts_OpenSource (27)
- linux_unix (62)
- life_sth (21)
- js_css_html_xml_nodejs (69)
- design_pattens (1)
- Perl (8)
- php_ecshop (4)
- DB_Mysql_Oracle_Informix_SqlServer (43)
- JSTL (8)
- Testing_自动化测试 (42)
- DB_ID_UUID (4)
- SEM_SEO (1)
- english_study_improvement (4)
- SVN_Git (9)
- WebService_SOA_CloudComputing (3)
- E-Commerce (1)
- Lucene_Solr (7)
- others (2)
- Regex (2)
- tomcat_jetty (8)
- zeroc-ice (1)
- java_excel (5)
- ant_maven_gradle (5)
- Unity_VR_AR_C# (2)
- jmeter (1)
- XPath_dom4j (1)
- Ruby_and_Rails (68)
- write_a_rails (17)
- manage_and_team (1)
- getting_real (1)
- ubuntu (20)
- git_and_git_flow (7)
- TODO (1)
- PM_design (2)
- Python_and_Django (8)
- NoSql_mongo_redis (24)
- C/C++ (3)
- vi_vim_gvim (0)
- c#_.Net_windows编程_dll (10)
- Php_and_Yii (9)
- Android_IOS (31)
- Mysql (5)
- sa_运维_network_硬件 (37)
- lua (2)
- c_cpp_VisualStudio (21)
- 硬件-RM-Arduino (6)
最新评论
-
shenkun58:
...
NoClassDefFoundError: Could not initialize springframework.BeanCreationException -
liaojia1:
正解,感谢
NoClassDefFoundError: Could not initialize springframework.BeanCreationException -
flingfox63:
谢谢分享,电脑上有IPV6,导致了Guard启动不了……
ruby错误解决: Address family not supported by protocol - connect(2) -
c39274936:
s = "hello_world_ruby" ...
驼峰格式和下划线格式转换_translation between camel and snake format -
yfj300:
学习了学习了学习了学习了
硬盘基本知识(磁道、扇区、柱面、磁头数、簇、MBR、DBR)
下面是几篇不错的文章,论坛还有很多,可以搜一下,讨论的相当火热!
http://blog.csdn.net/happyzhm5/archive/2007/08/09/1734047.aspx
http://www.iteye.com/topic/103804?page=1
我的总结:
这个问题的起源在研究Hibernate和公司框架时发现的Session release问题,看源码和资料,发现用ThreadLocal比较多。
June 总结:
1. 原理(可以这么想,但内部src不是这样)
通过例子可以看出:ThreadLocal的原理是用一个synchronized Map<Thread, Object>来存储当前线程相关的变量。这样在每一个线程用到obj时,都要取new一个Object。这其实也是很消耗内存的
2. 与new Object的区别
好处1 :区别在于同一个线程用到的都是同一个实例,也就是说本线程在不同的时间,不同的地方(函数等)用到的都是同一个obj,这样的好处是:减少了new 出来的实例obj数量!
好处2 :同一个线程共享一个实例变量,而线程间的实例变量却不同!
这个好处可以用在Dao操作时,同一个线程得到同一个Session,这样方便于Transaction的整体操作!
好处3 :既然用到obj时不用取new,这样也就少了分配空间、初始化、等开销,这本身相当于一个缓存,只不过这个缓存不是全局的,而是线程局部的!
坏处 :同一个线程共享同一个同一个obj可能会造成混淆!即在线程内,又得注意同步:即当前obj的状态!这个坏处一般破坏不大,因为在同一个线程内,一般不会再开线程,同时,在一个Thread内,是顺序执行,我们非常熟悉,一般不会出错,忘了顺序走过来的值现在的状态(即同一个线程不开子线程 = = 单线程,那么状态可以知道)。多线程的根本问题在于多个线程执行时间、顺序是随即的异步的,状态是不可预测或随机的。
3. synchronized与ThreadLocal
首先说资源共享与竞争,这其实一样,都是多个Thread随机的访问某个变量值,如果不加设置,可能会导致读脏数据、写冲突、等问题。
(1) 需要共享,这个值 不可以设置 不可以改变 那么可以用一个final static解决
(2) 需要共享,这个值可以设置可以改变,那么共享的话会出错!
A 如果需要同步该数据,那么需要用synchronized
B 如果不需要同步数据,那么可以把这个变量变成线程内变量
根据上面分析,synchronized是为了解决同步问题,而同步根本用不着ThreadLocal。
ThreadLocal解决的是同一个线程内的资源共享问题,而synchronized 解决的是多个线程间的资源共享问题,两个问题没有可比性。
4. ThreadLocal根本的用处
从上面ThreadLocal与new Object、与synchronized 的比较,可以知道,ThreadLocal最根本的用处在于:线程内共享数据,即保证当前线程内取到的都是统一对象的引用。
好处:在同一个线程内,完全不相关的两个段代码、函数之间如何共享一个变量呢?通过ThreadLocal可以做到
而且这两段代码之间不用显式的传递参数,降低了耦合。
在java_doc里的描述很到位!如下:
该类提供了线程局部变量。这些变量不同于它们的普通对应物,因为访问一个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的私有静态字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。
每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。
5. 遗留问题:如何释放资源
ThreadLocal中,其它线程无法访问本线程的局部变量!其实也不需要访问,如果需要,那就需要用别的方法!
那么,当前线程结束后,如何才能释放掉现在占用的资源呢?ThreadLocal并没有留下接口,亦不知道其内如是如何做的,但释放资源是个大问题,尤其在保存有重量级资源时,如连接数据库,Socket连接等。
终极问题?如何释放资源
ThreadLocal中,其它线程无法访问本线程的局部变量!其实也不需要访问,如果需要,那就需要用别的方法!
那么,当前线程结束后,如何才能释放掉现在占用的资源呢?ThreadLocal并没有留下接口,亦不知道其内如是如何做的,但释放资源是个大问题,尤其在保存有重量级资源时,如连接数据库,Socket连接等。
Java中ThreadLocal没有留下接口destroy,很是遗憾!
如何释放资源,等待ing ...
------------------------------------------------------------
2009-04-08更新
写这篇文章好久,提问也但没有人来看,不过本人这几天研究发现一个不错的方法,理论可以,还有待实践。
ThreadLocal没有留下释放资源的接口是有原因的:谁知道什么时候线程终止?也就是说,线程的生命周期是不可预期的!而Thread本身没有留下destroy接口,那么ThreadLocal就没办法了!
解决的方法就是用java1.2引入的弱引用:PhantomReference,重写父类ReferenceQueue,促发释放资源的动作!
没时间了,特简写,有需要的朋友可以交流!
http://blog.csdn.net/happyzhm5/archive/2007/08/09/1734047.aspx
http://www.iteye.com/topic/103804?page=1
我的总结:
这个问题的起源在研究Hibernate和公司框架时发现的Session release问题,看源码和资料,发现用ThreadLocal比较多。
June 总结:
1. 原理(可以这么想,但内部src不是这样)
通过例子可以看出:ThreadLocal的原理是用一个synchronized Map<Thread, Object>来存储当前线程相关的变量。这样在每一个线程用到obj时,都要取new一个Object。这其实也是很消耗内存的
2. 与new Object的区别
好处1 :区别在于同一个线程用到的都是同一个实例,也就是说本线程在不同的时间,不同的地方(函数等)用到的都是同一个obj,这样的好处是:减少了new 出来的实例obj数量!
好处2 :同一个线程共享一个实例变量,而线程间的实例变量却不同!
这个好处可以用在Dao操作时,同一个线程得到同一个Session,这样方便于Transaction的整体操作!
好处3 :既然用到obj时不用取new,这样也就少了分配空间、初始化、等开销,这本身相当于一个缓存,只不过这个缓存不是全局的,而是线程局部的!
坏处 :同一个线程共享同一个同一个obj可能会造成混淆!即在线程内,又得注意同步:即当前obj的状态!这个坏处一般破坏不大,因为在同一个线程内,一般不会再开线程,同时,在一个Thread内,是顺序执行,我们非常熟悉,一般不会出错,忘了顺序走过来的值现在的状态(即同一个线程不开子线程 = = 单线程,那么状态可以知道)。多线程的根本问题在于多个线程执行时间、顺序是随即的异步的,状态是不可预测或随机的。
3. synchronized与ThreadLocal
首先说资源共享与竞争,这其实一样,都是多个Thread随机的访问某个变量值,如果不加设置,可能会导致读脏数据、写冲突、等问题。
(1) 需要共享,这个值 不可以设置 不可以改变 那么可以用一个final static解决
(2) 需要共享,这个值可以设置可以改变,那么共享的话会出错!
A 如果需要同步该数据,那么需要用synchronized
B 如果不需要同步数据,那么可以把这个变量变成线程内变量
根据上面分析,synchronized是为了解决同步问题,而同步根本用不着ThreadLocal。
ThreadLocal解决的是同一个线程内的资源共享问题,而synchronized 解决的是多个线程间的资源共享问题,两个问题没有可比性。
4. ThreadLocal根本的用处
从上面ThreadLocal与new Object、与synchronized 的比较,可以知道,ThreadLocal最根本的用处在于:线程内共享数据,即保证当前线程内取到的都是统一对象的引用。
好处:在同一个线程内,完全不相关的两个段代码、函数之间如何共享一个变量呢?通过ThreadLocal可以做到
而且这两段代码之间不用显式的传递参数,降低了耦合。
在java_doc里的描述很到位!如下:
该类提供了线程局部变量。这些变量不同于它们的普通对应物,因为访问一个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的私有静态字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。
每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。
5. 遗留问题:如何释放资源
ThreadLocal中,其它线程无法访问本线程的局部变量!其实也不需要访问,如果需要,那就需要用别的方法!
那么,当前线程结束后,如何才能释放掉现在占用的资源呢?ThreadLocal并没有留下接口,亦不知道其内如是如何做的,但释放资源是个大问题,尤其在保存有重量级资源时,如连接数据库,Socket连接等。
终极问题?如何释放资源
ThreadLocal中,其它线程无法访问本线程的局部变量!其实也不需要访问,如果需要,那就需要用别的方法!
那么,当前线程结束后,如何才能释放掉现在占用的资源呢?ThreadLocal并没有留下接口,亦不知道其内如是如何做的,但释放资源是个大问题,尤其在保存有重量级资源时,如连接数据库,Socket连接等。
Java中ThreadLocal没有留下接口destroy,很是遗憾!
如何释放资源,等待ing ...
------------------------------------------------------------
2009-04-08更新
写这篇文章好久,提问也但没有人来看,不过本人这几天研究发现一个不错的方法,理论可以,还有待实践。
ThreadLocal没有留下释放资源的接口是有原因的:谁知道什么时候线程终止?也就是说,线程的生命周期是不可预期的!而Thread本身没有留下destroy接口,那么ThreadLocal就没办法了!
解决的方法就是用java1.2引入的弱引用:PhantomReference,重写父类ReferenceQueue,促发释放资源的动作!
没时间了,特简写,有需要的朋友可以交流!
发表评论
-
打包Java程序为.exe文件
2023-09-27 16:25 148= = = 打包Java程序为.exe文件 fro ... -
Java怎么生成exe可执行文件【图文讲解】
2023-09-27 16:21 180= 开发的工具,让客户体验一下再说。此时又不想发源码,怕 ... -
Java8 List集合Stream流方法操作详解
2023-09-27 16:02 145= = = from: https://zhuanl ... -
Java8 List集合Stream流方法操作详解
2023-09-27 15:59 236= = = from: https://zhuan ... -
Java8 List集合Stream流方法操作详解
2023-09-27 15:56 99= = = from: https://zhuanl ... -
【原创】Cannot create property=xxx for JavaBean=【lombok 和 yaml包 混合报错】
2023-02-04 23:31 579= = = 问题: 同时使用lombok 和 ... -
【摘】Java文档注释用法+JavaDoc的使用详解
2022-09-12 16:32 219= = 节约重复注释 使用@inheritDo ... -
【朝花夕拾】java内部类,原理,使用
2022-08-09 22:52 168= 碰到类似问题,多读《thinking in java ... -
【拾遗】java数组copy拷贝复制的工具类方法
2022-06-11 21:20 508= 对工具类来说,copyOfRange 最好用。 这 ... -
利用Httpclient下载图片,java不用httpClient下载图片
2022-05-30 22:25 368= = = from:https://blog.csd ... -
为什么要使用lombok?
2022-04-04 20:46 274= = = 参考:https://blog.csd ... -
朝花夕拾:java-向上转型中变量覆盖要小心使用_继承过程中Java子类父类属性的覆盖问题
2022-01-13 17:31 338==== 现在的代码结构设计的复杂起来了,为了后来人编写 ... -
【Mysql数据库】Cause: java.sql.SQLException: The table 'xxx' is full
2022-01-04 17:03 1376= 本地开发测试,怎 ... -
JAVA工具类学习-java 两个list 交集 并集 差集 去重复并集
2021-09-10 16:17 795= = = List<String> ... -
java汉字判断,中文符号判断,中文标点符号判断
2021-09-02 19:07 1022=== = = 一、判断中文汉字 st ... -
velocity的模板笔记总结文档-方便查阅
2020-04-28 14:41 307= 最好把这几个官网文档看了: 官网官方文档refer ... -
mjson:像python和ruby一样好用的java类库操作json_js
2020-04-17 20:54 439= = = JSON Library for Jav ... -
关于idea2019.2-2019.3版本中文控制台乱码问题,tomcat7-tomcat8乱码
2020-04-04 23:20 393= 1 idea2019.2-2019.3版本中文控制台乱 ... -
Tomcat7-Tomcat8的manager配置以及在idea下的异常表现
2020-04-04 23:13 442Tomcat7-Tomcat8的manager配置以及在id ... -
selenium不打开浏览器和打开浏览器-很方便(java)
2020-03-23 21:38 1218= 自动化测试的时候,每次都打开浏览器,会影响全部测试运行 ...
相关推荐
ThreadLocal入门教程。 讲解了线程安全和ThreadLocal的使用的基本知识。
ThreadLocal
javaee开发常见的模式有MVC模式,在C层中常常会再次分层,如:servlet(web层)、service(业务逻辑层)、dao(数据访问层),其中service和dao最容易混在一起,如转...所以,使用ThreadLocal可以解决这样的分层问题。
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
正确理解ThreadLocal.pdf
DbUTils中用ThreadLocal类
ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案.docx
主要介绍ThreadLocal的原理,实例分析以及注意事项
NULL 博文链接:https://bijian1013.iteye.com/blog/2380233
java 简单的ThreadLocal示例
ThreadLocal的几种误区ThreadLocal的几种误区ThreadLocal的几种误区
Synchronized与ThreadLocal
本例以序列号生成的程序为例,展示ThreadLocal的使用
ThreadLocal保证一个类的实例变量在各个线程中都有一份单独的拷贝, 从而不会影响其他线程中的实例变量
设计模式及ThreadLocal详细讲解资料,想要学习java或者提升自己技术的同学可以下载观看
详解java底层实现原理,ThreadLocal底层实现的数据结构,为什么不会导致内存泄露
JDBC事务的封装和Threadlocal实例,参考博客:http://blog.csdn.net/daijin888888/article/details/50988053