- 浏览: 188411 次
- 性别:
- 来自: 杭州
最新评论
-
wahahachuang5:
web实时推送技术使用越来越广泛,但是自己开发又太麻烦了,我觉 ...
转发:websocket 通信协议介绍 -
爱很执着:
好
Java多线程同步机制(synchronized) -
我在路上看风景:
不错啊,看完了,疑惑不存在了。 新浪微博@最美最好的你
Java多线程同步机制(synchronized) -
hbiao68:
写得很好,受教了
Java Resource路径总结二 -
JamesLiuX:
有Freelancer的老鸟吗,求组队!
Freelancer
参考:http://www.blogjava.net/pengpenglin/archive/2008/09/05/227276.html
http://lavasoft.blog.51cto.com/62575/51926
ThreadLocal的核心思想很简单:为每个独立的线程提供一个变量的副本。
我们知道在多线程的情况下,几个线程同时访问同一变量的情况很常见,Java提供的synchronized关键字使用了“同步锁”的机制来阻止线程的竞争访问,即“以时间换空间”。
ThreadLocal则使用了“拷贝副本”的方式,人人有份,你用你的,我用我的,大家互不影响,是“以空间换时间”。每个线程修改变量时,实际上修改的是变量的副本,不怕影响到其它线程。
ThreadLocal的一个最常见应用是为每个线程分配一个唯一的ID,例如线程ID,事务ID,一般保存在ThreadLocal中的变量都是很少需要修改的。
为了加深对ThreadLocal的理解,下面我使用一个例子来演示ThreadLocal如何隔离线程间的变量访问和修改:
【1】SerialNum类
package example.thread.threadLocal; public class SerialNum { private static int nextSerialNum = 1 ; @SuppressWarnings( " unchecked " ) private static ThreadLocal serialNum = new ThreadLocal() { protected synchronized Object initialValue() { return new Integer(nextSerialNum ++ ); } }; public static int get() { return ((Integer) (serialNum.get() )).intValue(); } @SuppressWarnings( " unchecked " ) public static void set(Integer newSerial){ serialNum.set(newSerial); } }
【2】GetSerialNumThread
package example.thread.threadLocal; public class GetSerialNumThread implements Runnable { public static void main(String args[]) { GetSerialNumThread serialNumGetter = new GetSerialNumThread(); Thread t1 = new Thread(serialNumGetter, " Thread A " ); Thread t2 = new Thread(serialNumGetter, " Thread B " ); t1.start(); try { t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } t2.start(); } public void run() { int mySerialNum = getSerialNum(); System.out.println( " 线程 " + Thread.currentThread().getName() + " 获取到的序列号是 " + mySerialNum); System.out.println( " 线程 " + Thread.currentThread().getName() + " 修改了序列号为 " + (mySerialNum * 3 )); setSerialNum(mySerialNum * 3 ); System.out.println( " 线程 " + Thread.currentThread().getName() + " 再次获得的序列号是 " + getSerialNum()); } private int getSerialNum() { return SerialNum.get(); } private void setSerialNum( int newSerialNum) { SerialNum.set( new Integer(newSerialNum)); } }
运行的结果如下:
线程 Thread A 修改了序列号为3
线程 Thread A 再次获得的序列号是3
线程 Thread B 获取到的序列号是2
线程 Thread B 修改了序列号为6
线程 Thread B 再次获得的序列号是6
可见第一个线程在调用SerialNum.set(int)方法修改static变量时,其实修改的是它自己的副本,而不是修改本地变量,第二个线程在初始化的时候拿到的序列号是2而不是7。
为什么会这样呢?明明serialNum是静态变量啊?其实我们只需要看看ThreadLocal的内部构造就知道了:
A. ThreadLocal的get()方法:
/** * Returns the value in the current thread's copy of this thread-local * variable. Creates and initializes the copy if this is the first time * the thread has called this method. * * @return the current thread's value of this thread-local */ public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null ) return (T)map.get( this ); // Maps are constructed lazily. if the map for this thread // doesn't exist, create it, with this ThreadLocal and its // initial value as its only entry. T value = initialValue(); createMap(t, value); return value; }
B. ThreadLocal的set()方法:
/** * Sets the current thread's copy of this thread-local variable * to the specified value. Many applications will have no need for * this functionality, relying solely on the { @link #initialValue} * method to set the values of thread-locals. * * @param value the value to be stored in the current threads' copy of * this thread-local. */ public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null ) map.set( this , value); else createMap(t, value); }
可以看到ThreadLocal在内部维护了一个Map,将变量的值和线程绑定起来,get/set方法都是对该线程对应的value进行操作,所以不会影响到其它线程。
发表评论
-
Java集合框架
2014-08-19 18:36 541Java Collections Framework是Ja ... -
java线程安全总结
2011-11-11 10:38 1042总结的很好的java线程安全文章 http://www.it ... -
深入分析 Java 中的中文编码问题
2011-08-29 14:39 895一篇比较深入清晰的中文编码分析文章: http://www. ... -
使用dom4j四种读取xml文件的方法
2011-07-18 11:10 1370转:http://blog.163.com/chenhui_j ... -
Java Resource路径总结二
2011-07-15 14:02 11069Class.getResource()与Class.getRe ... -
java 读取配置文件(properties)
2011-07-11 17:59 1238使用J2SE API读取Properties文件的六种方法 ... -
常见的海量数据处理方法
2011-07-04 12:01 1034转:http://www.iteye.com/topi ... -
Servlet 工作原理解析
2011-06-30 12:04 1250Servlet 工作原理解析 http://www.ibm. ... -
java调用oracle序列方法
2011-06-14 15:29 24411. 创建oracle序列 create sequence ... -
java调用msyql函数和存储过程的方法
2011-06-14 14:11 1296java调用msyql函数和存储过程的方法 2009年0 ... -
java多线程专题测试五:死锁
2011-06-12 23:36 3147死锁 1、如何确认死锁的发生? Java虚拟机死锁发生 ... -
java多线程专题测试四:JAVA内存模型
2011-06-12 23:35 1109JAVA内存模型 1、什么是内存模型,什么是可见性? ... -
java多线程专题测试三:concurrent包
2011-06-09 13:07 1284concurrent包 1、Lock和Condition ... -
java多线程专题测试二:多线程读写安全
2011-06-09 12:27 1782多线程读写安全 1、sync ... -
java多线程总结
2011-06-09 10:45 967线程:是指进程中的一个执行流程。 线程与进程的区别:每个进程 ... -
java多线程专题测试一:基础知识
2011-06-09 00:07 1296一. 基础知识 1. 进程和 ... -
Java发送Http请求,解析html返回
2011-06-07 23:13 932http://caspers.iteye.com/blog/2 ... -
Java中四种XML解析技术的学习与比较
2011-06-07 16:56 1025转:http://blog.sina.com.cn/s ... -
HTTP内容格式详细说明2(协议)
2011-06-02 16:44 13046 响应头域 响应头域允 ... -
HTTP内容格式详细说明1(协议)
2011-06-02 00:28 1083前言 HTTP 消息由客户端到服务器的请求和服务器 ...
相关推荐
不让第二步和第三步重排序-DoubleCheck方案二:基于类初始化-静态内部类饿汉式饿汉式与懒汉式最大区别序列化破坏单例模式原理枚举单例基于容器的单例模式基于TreadLocal线程单例源码分析-JDK源码分析-spring其他相关...
并发:线程基础、JMM、AQS、CAS、锁与线程安全(Synchronized、ReentrantLock)、JUC、线程池、定时任务、TreadLocal 等。 4. Java8/IO/其他 Java8:Lambda、流 Stream 等。 IO:文件操作、IO流、网络操作等(NIO 放...
<项目介绍> - 四连杆机构的仿真 --m3_1.m: 位置问题求解 --m2_1.m: 速度问题求解 --FourLinkSim.slx: Simlink基于加速度方程的仿真 --FourLinkSim2.slx: Simscape简化模型仿真 --FourLinkSim3.slx: Simscape CAD模型仿真 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
ridge_regression 用于岭回归的python代码(已实现以预测下个月的CO2浓度) 资料可用性 文件 Ridge.py :标准函数和Ridge回归函数window_make.py :使用滑动窗口方法制作大小为p(窗口大小)的时间序列列表。 Final_version.ipynb :使用Co2数据对代码进行实验
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
功能说明: 系统主要分为系统管理员和用户两个部分,系统管理员主要功能包括首页,个人中心,用户管理,节日风俗管理,饮食风俗管理,服饰风俗管理,礼仪风俗管理,信仰风俗管理,建筑风俗管理,我的收藏管理,留言板管理,论坛管理,系统管理。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上
中国城市温度历史数据(2000-2020)-最新全集.zip
中国土地利用现状遥感监测数据(1km)-最新.zip
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值
java资源Google API for Java提取方式是百度网盘分享地址
中国分地区地级市泰尔指数数据集(2000-2019).zip
环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上
环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上
功能说明: 系统功能实现了首页,房源信息,交流论坛,公告资讯,个人中心,后台管理等功能。系统的后台实现了个人中心,用户管理,房东管理,房源类型管理,房源信息管理,在线咨询管理,预约信息管理,订单信息管理,签订信息管理,申请退租管理,交流论坛,系统管理等功能的添加、删除和修改。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上
yolo算法-电线杆数据集-1493张图像带标签-.zip;yolo算法-电线杆数据集-1493张图像带标签-.zip;yolo算法-电线杆数据集-1493张图像带标签-.zip
安装包eclipse-jee-neon-3-win32-x86_64提取方式是百度网盘分享地址
PartSegCore_compiled_backend-0.12.0a0-cp36-cp36m-win_amd64.whl.rar
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。