java并发编程:深入剖析threadlocal-java开发java经验技巧

java并发编程:深入剖析threadlocal-java开发java经验技巧

ID:30768627

大小:84.00 KB

页数:12页

时间:2019-01-03

java并发编程:深入剖析threadlocal-java开发java经验技巧_第1页
java并发编程:深入剖析threadlocal-java开发java经验技巧_第2页
java并发编程:深入剖析threadlocal-java开发java经验技巧_第3页
java并发编程:深入剖析threadlocal-java开发java经验技巧_第4页
java并发编程:深入剖析threadlocal-java开发java经验技巧_第5页
资源描述:

《java并发编程:深入剖析threadlocal-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java并发编程:深入剖权「ThrcadLocal-编程开发技术Java并发编程:深入剖析ThreadLocal原文出处:海子想必很多朋友对ThreadLocal并不陌生,今天我们就來一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。以下是木文目录大纲:一.对ThreadLocal的理解二.深入解析ThreadLocal类三.ThreadLocal的应用场景若有不正之处请多多谅解,并欢迎批评指正。一・对ThreadLocal的理解Thread

2、Local,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多刖友都知道ThreadLocal为变量在每个线程屮都创建了一个副本,那么每个线程可以访问自己内部的副本变量。这句话从字面上看起来很容易理解,但是真正理解并不是那么容易。我们还是先来看-个例子:classConnectionManager{privatestaticConnectionconnect二null;publicstaticConneclionopenConnection(){if(cormect==null){connect=DrivcrManagcr・gctConncction();}fetu

3、rnconnect;}publicstaticvoidcloscConnection(){if(connect!二null)connect.close();假设有这样一个数据库链接管理类,这段代码在单线程中使用是没有任何问题的,但是如果在多线程中使用呢?很显然,在多线程中使用会存在线程安全问题:第一,这里面的2个方法都没有进行同步,很可能在opcnConncction方法中会多次创建connect;第二,由于connect是共享变量,那么必然在调用connect的地方需要使用到同步来保障线程安全,因为很可能一个线程在使用connect进行数据库操作,而另外一个线程调用closeconnecti

4、on关闭链接。所以出于线程安全的考虑,必须将这段代码的两个方法进行同步处理,并且在调用connect的地方需要进行同步处理。这样将会大大影响程序执行效率,因为一个线程在使用connect进行数据库操作的时候,其他线程只有等待。那么大家來仔细分析一下这个问题,这地方到底需不需要将connect变量进行共享?事实上,是不需耍的。假如每个线程中都有一个connect变量,各个线程之间对connect变量的访问实际上是没有依赖关系的,即一个线程不需要关心其他线程是否对这个connect进行了修改的。到这里,可能会有朋友想到,既然不需要在线程Z间共享这个变量,可以直接这样处理,在毎个需要使用数据库连接的

5、方法中具休使用时才创建数据库链接,然后在方法调用完毕再释放这个连接。比如下面这样:classConnect!onManager{privateConnectionconnect二null;publicConnectionopenConnection(){if(connect二二null){connect二DrivcrManagcr.gctConncction();}returnconnect;publicvoidcloscConncction(){if(connect!二null)connect.close();classDao{publicvoidinsert(){ConnectionMan

6、agerconnectionManager二newConnectionManager();Connectionconnection=connectionManager.openConnection();//使用connection进彳亍操作conncctionMemagcr・closcConncction();}这样处理确实也没有任何问题,由于每次都是在方法内部创建的连接,那么线程之间自然不存在线程安全问题。但是这样会有一个致命的影响:导致服务器压力非常大,并且严重影响程序执行性能。由于在方法中需要频繁地开启和关闭数据库连接,这样不尽严重影响程序执行效率,述可能导致服务器压力巨大。那么这种情况

7、下使用ThreadLocal是再适合不过的了,因为ThreadLocal在每个线程中对该变量会创建一个副本,即毎个线程内部都会有一个该变量,且在线程内部任何地方都可以使用,线程之间互不影响,这样一来就不存在线程安全问题,也不会严重影响程序执行性能。但是要注意,虽然ThreadLocal能够解决上面说的问题,但是由于在每个线程中都创建了副本,所以要考虑它对资源的消耗,比如内存的占用会比不使用Thre

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。