一.对ThreadLocal的理解

  ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

  这句话从字面上看起来很容易理解,但是真正理解并不是那么容易。

  我们还是先来看一个例子:

class ConnectionManager {private static Connection connect = null;public static Connection openConnection() {if(connect == null){connect = DriverManager.getConnection();}return connect;}public static void closeConnection() {if(connect!=null)connect.close();}
}

  

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

  所以出于线程安全的考虑,必须将这段代码的两个方法进行同步处理,并且在调用connect的地方需要进行同步处理。

  这样将会大大影响程序执行效率,因为一个线程在使用connect进行数据库操作的时候,其他线程只有等待。

  那么大家来仔细分析一下这个问题,这地方到底需不需要将connect变量进行共享?事实上,是不需要的。假如每个线程中都有一个connect变量,各个线程之间对connect变量的访问实际上是没有依赖关系的,即一个线程不需要关心其他线程是否对这个connect进行了修改的。

  到这里,可能会有朋友想到,既然不需要在线程之间共享这个变量,可以直接这样处理,在每个需要使用数据库连接的方法中具体使用时才创建数据库链接,然后在方法调用完毕再释放这个连接。比如下面这样:

class ConnectionManager {private  Connection connect = null;public Connection openConnection() {if(connect == null){connect = DriverManager.getConnection();}return connect;}public void closeConnection() {if(connect!=null)connect.close();}
}class Dao{public void insert() {ConnectionManager connectionManager = new ConnectionManager();Connection connection = connectionManager.openConnection();//使用connection进行操作connectionManager.closeConnection();}
}

  

这样处理确实也没有任何问题,由于每次都是在方法内部创建的连接,那么线程之间自然不存在线程安全问题。但是这样会有一个致命的影响:导致服务器压力非常大,并且严重影响程序执行性能。由于在方法中需要频繁地开启和关闭数据库连接,这样不尽严重影响程序执行效率,还可能导致服务器压力巨大。

  那么这种情况下使用ThreadLocal是再适合不过的了,因为ThreadLocal在每个线程中对该变量会创建一个副本,即每个线程内部都会有一个该变量,且在线程内部任何地方都可以使用,线程之间互不影响,这样一来就不存在线程安全问题,也不会严重影响程序执行性能。

  但是要注意,虽然ThreadLocal能够解决上面说的问题,但是由于在每个线程中都创建了副本,所以要考虑它对资源的消耗,比如内存的占用会比不使用ThreadLocal要大。

来源: http://www.cnblogs.com/dolphin0520/p/3920407.html

转载于:https://www.cnblogs.com/wzdnwyyu/p/11152587.html

一.对ThreadLocal的理解相关推荐

  1. python中ThreadLocal的理解与使用

    一.对 ThreadLocal 的理解 ThreadLocal,有的人叫它线程本地变量,也有的人叫它线程本地存储,其实意思一样. ThreadLocal 在每一个变量中都会创建一个副本,每个线程都可以 ...

  2. ThreadLocal的理解

    ThreadLocal的理解     [文章出处]http://blog.csdn.net/lufeng20/article/details/24314381 (五星推荐)     [参考博客]htt ...

  3. 精选(26)面试官:讲讲你对ThreadLocal的理解

    前言 在面试环节中,考察"ThreadLocal"也是面试官的家常便饭,所以对它理解透彻,是非常有必要的. 有些面试官会开门见山的提问: "知道ThreadLocal吗? ...

  4. 面试官:听说你精通并发编程,来说说你对ThreadLocal的理解

    ThreadLocal 简介 ThreadLocal 是一个解决多线程并发问题的工具类,ThreadLocal有的人可能理解为本地线程,这个并不是正确的理解.「ThreadLocal并不是一个线程,应 ...

  5. 我对ThreadLocal的理解

    声明:小弟菜狗一个.对ThreadLocal的描写叙述和理解难免有所偏差 近期由于须要深入的了解android的handler消息机制而去查看了Looper的源代码.众所周知在主线程中是不须要在程序猿 ...

  6. 谈谈对ThreadLocal的理解?(基于jdk1.8)

    在java的多线程模块中,ThreadLocal是经常被提问到的一个知识点,提问的方式有很多种,可能是循序渐进也可能是就像我的题目那样,因此只有理解透彻了,不管怎么问,都能游刃有余. 这篇文章主要从以 ...

  7. ThreadLocal 的理解

    介绍 ThreadLocal类用来提供线程内部的局部变量.这种变是在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量,ThreadLocal实例通常来说都 ...

  8. 多线程与ThreadLocal的理解笔记

    一.线程与进程的区别 进程是指一种"自包容"的运行程序,由操作系统直接管理,直接运行,有自己的地址空间,每个进程一开启都会消耗内存. 线程是进程内部单一的顺序控制流,一个进程拥有多 ...

  9. ThreadLocal原理分析与使用场景

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:阿凡卢 cnblogs.com/luxiaoxun/p/87 ...

最新文章

  1. 一道指针压轴笔试题讲解 (进阶指针必看)
  2. php大数组循环嵌套的性能优化
  3. linux系统启动过程(三)
  4. ARP欺骗原理与模拟
  5. SOE服务的地址构建注意点_大小写
  6. c++中list容器
  7. 【POJ - 1275】Cashier Employment(差分约束,建图)
  8. .net里鼠标选中的text数据怎么获取_数据快速对比,这个快捷键你都不会,难怪要加班...
  9. vue用公共组件页面传值_vuejs几种不同组件(页面)间传值的方式
  10. 为什么那么多自学WEB前端的人后来都放弃了?
  11. 终于找到中文版JDK1.8-API了~
  12. 软考信息系统项目管理师_体系介绍_证书作用价值_报考条件_考生分析---软考高级之信息系统项目管理师001
  13. Bootstrap-学习系列
  14. 引领架构创新之路第八届系统架构师大会撼世来袭
  15. Android NDK之JNI陷阱
  16. Nios内部RAM固化配置
  17. 一个基于verilog的FPGA 的LCD 1602 显示程序
  18. js获取 当前URL中的参数
  19. C语言如何输出100以内的质数?(带注释)
  20. 如何使用python进行社交网络分析

热门文章

  1. 用计算机考试有老师引导,河北省教师计算机考试评价题及答案
  2. 人之间的尊重是相互的_人与人之间要学会相互尊重
  3. css制作俄罗斯方块,H5原创俄罗斯方块(基于canvas)
  4. OpenCV-Python实战(17)——人脸识别详解
  5. 新疆师范大学计算机研究生值得读吗,研究生还值得读吗
  6. 阵列函数 java_Java复制阵列– Java中的阵列复制
  7. Android Wear Hello World
  8. python中的字符数字之间的转换函数
  9. 高级开发进阶到架构师的必要条件是什么?
  10. yum报[Errno 256] No more mirrors to try