ThreadLocal知识介绍

ThreadLocal为解决多线程的并发问题提供了一种新的思路,使用这个工具类可以优美的编写出多线程程序。
ThreadLocal他不是一个线程,而是线程的一个本地化对象。当工作于多个线程的对象使用ThreadLocal维护变量时,ThreadLocal为每个使用改变量的线程分配一个独立的变量副本,所以每一个线程可以独立的改变自己的副本,而不会影响其他线程的对应的副本。
ThreadLocal接口有四个方法
  1. void set(Object value)设置当前的线程局部变量的值
  1. public Obejct get()返回当前的线程所对应的线程局部变量的值
  1. public void remove()将当前的线程的局部变量的值删除掉
  1. protected Object initialValue()返回该线程局部变量的初始值,默认实现直接返回一个null。

ThreadLocal如何做到为每一个线程维护一份独立的变量副本呢?实现的思路是:在

ThreadLocal类中有个Map,用于存储每一个线程的变量副本,Map中元素的key为线程对象,而value对应线程的变量副本。

下面直接上代码看实例:
public class SequenceNumber  
{private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>(){public Integer initialValue(){return 0;}};public int  getNextNum(){seqNum.set(seqNum.get()+1);return seqNum.get();}public static void main (String[] args) throws java.lang.Exception{SequenceNumber sn  = new SequenceNumber();TestClient t1 = new TestClient(sn);TestClient t2 = new TestClient(sn);TestClient t3 = new TestClient(sn);t1.start();t2.start();t3.start();}private static class TestClient extends Thread{private SequenceNumber sn;public TestClient(SequenceNumber sn){this.sn = sn;}public void run (){for (int i= 0;i<3 ;i++ ) {System.out.println("thread["+ Thread.currentThread().getName()+"]sn["+ sn.getNextNum()+"]");}}}
}
运行后的输出如下:

从结果可以看出:每个线程所产生的程序虽然共享同一个
SequenceNumber 实例 ,但是他们呢并没有相互干扰的情况出现,而是各自产生独立的序列号,这是因为我我们通过<h3>ThreadLocal为每一个线程提供了独立的副本。</h3>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

维修变频器和服务器赚钱吗,【转】一个变频器维修老手的7年经验与心得

到今年为止&#xff0c;我在电路板维修行业已经七年了&#xff0c;手里经过的板子不计其数&#xff0c;大的小的&#xff0c;简单的难的都有&#xff0c;帮助很多的有名企业度过很多的难关。现在每个企业都不同程度的用到许多变频器&#xff0c;而不管哪种变频器他 的寿命好像都…

第十三章、拷贝控制

一、拷贝控制操作 1、拷贝构造函数&#xff1a;一个构造函数的一个参数是自身类类型的引用&#xff0c;且额外参数都有默认值 class Foo{ public:Foo(const Foo&); //拷贝构造函数&#xff1b;&#xff1b;最好是const类型&#xff1b;不应该是explicit的 }拷贝构造…

ThreadLocal和线程同步机制的对比

ThreadLocal和线程同步都是为了解决多线程中相同变量的访问冲突问题&#xff0c;那么&#xff0c;二者的区别在哪里&#xff1f;和线程同步机制对比&#xff0c;ThreadLocal有什么优势&#xff1f; 同步机制中通过对象的锁机制保证同一时间只有一个线程来访问变量&#xff0c;这…

关于电脑自动获取和静态IP的问题

无法设置静态IP和设置了静态IP&#xff0c;但是无效的问题。 1、先是重新安装TCP/IP协议 选TCP/IP&#xff0c;点安装&#xff0c;再选择协议&#xff0c;点添加&#xff0c;选从磁盘安装&#xff0c;路径为&#xff1a;C:\Windows\inf\1394.inf&#xff0c;点打开 此时&#x…

javaweb中报404错误

这里只提供了一点建议&#xff0c;404大家都懂得是找不到请求的页面&#xff0c;一般就是URL路径请求错误 但是我最近发现自己出现这个错误的原因是&#xff1a;每次的struts的配置文件的命名空间忘记加在了form表单的action名字所对应的前面&#xff0c;一定不要忘了当自己定…

深入浅出: Java回调机制(异步)

一、什么是回调 回调&#xff0c;回调。要先有调用&#xff0c;才有调用者和被调用者之间的回调。所以在百度百科中是这样的&#xff1a; 软件模块之间总是存在着一定的接口&#xff0c;从调用方式上&#xff0c;可以把他们分为三类&#xff1a;同步调用、回调和异步调用。 回调…

WCF资料

Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4转载于:https://www.cnblogs.com/HQFZ/p/4884243.html

SSH中为什么action需要用多例而dao层和service层为什么就用单例就可以

很简单的道理&#xff0c;就跟你自来水一样&#xff0c;有很多的水龙头&#xff0c;但水管只有一个。为啥要很多水龙头&#xff0c;因为有多个人同时用&#xff1b;为了避免长队&#xff0c;只能这样来分担压力为啥只有一个水管&#xff0c;易维护&#xff0c;集中处理。 使用…

Nagios配置

其实上篇Nogios安装只是安装了Nagios基本组件&#xff0c;虽然能够打开主页&#xff0c;但是如果不配置相关配置文件文件&#xff0c;那么左边菜单很多页面都打不开&#xff0c;相当于只是一个空壳子。接下来&#xff0c;我们来学习研究一下Nagios的配置,了解一下基本的配置和了…

服务器启动时Webapp的web.xml中配置的加载顺序

一 1、启动一个WEB项目的时候&#xff0c;WEB容器会去读取它的配置文件web.xml&#xff0c;读取<listener>和<context-param>两个结点。 2、紧急着&#xff0c;容创建一个ServletContext&#xff08;servlet上下文&#xff09;&#xff0c;这个web项目的所有部分都…

JQuery.autocomplete扩展功能:实现多列自动提示

最近做一个项目&#xff0c;用到了JQuery的自动补全函数&#xff0c;但默认的是只显示一列数据&#xff0c;所以就略加修改&#xff0c;拿出来献丑了。 下面这个是默认调用本地数据&#xff1a; $("#tags").autocomplete(["c","java", &…

用java创建UDF,并用于Hive

典型代码如下&#xff1a; 导入UDF类&#xff1a; import org.apache.hadoop.hive.ql.exec.UDF; public class UpperCassUDF extends UDF{ public String evaluate(String input){ if(inputnull){ return null; } else{ return new String(input.toUpperCase()); } } } 导出jar…

单元素枚举类实现单例模式

本文转载自&#xff1a;点击打开链接 Inspired by Effective Java. Singleton模式是在编程实践中应用最广泛的几种设计模式之一。以前知道的&#xff0c;实现单例的方法有两种(下面的A、B)。刚刚在读《Effective Java的时候》学到一种新的更好的方法(E)&#xff1a;单元素的枚举…

java web开发之 spring单元测试

以前开发web项目从来不喜欢用单元测试&#xff0c;每次都需要启动服务器&#xff0c;在浏览器中调试&#xff0c;有些错误还不一定发现得到。 最近公司开发一个项目&#xff0c;任务繁重&#xff0c;不由觉得以前那种测试模式太笨拙了&#xff0c;于是学习了使用Junit&#xf…

对于SpringMVC框架使用的时候出现“警告: No mapping found for HTTP request with URI [/login]”的问题解决方案...

今天&#xff0c;在myeclipse上导入了前几天的一个项目&#xff0c;但是怎么都运行不起来&#xff0c;可是在别人的电脑上都可以。从早上一直调到了现在&#xff08;期间也看了好多关于此类的帖子&#xff0c;但是都没能解决我的问题&#xff09;&#xff0c;终于找到了解决方案…

MySQL数据库事务中的行级锁,表级锁,页级锁

锁定用于确保事务完整性和数据库一致性。 锁定可以防止用户读取其他用户正在更改的数据&#xff0c;并防止多个用户同时更改相同的数据。 如果不使用锁定&#xff0c;数据库中的数据可能在逻辑上变得不正确&#xff0c;而针对这些数据进行查询可能会产生想不到的结果。 在计算机…

#error

#define SIZE 250 #if SIZE<1 || SIZE>200 #error "SIZE must be between 1 and 200" #endif转载于:https://www.cnblogs.com/guxuanqing/p/4892802.html

搭建spring MVC项目

首先&#xff0c;是要放入spring mvc所需要的包&#xff1a; 如果不用json功能就不需要json和gson包,还有数据库驱动包&#xff0c;我这里是用的postgresql数据库&#xff0c;其他数据库需替换掉这个包 然后就是配置文件&#xff1a; 先是web.xml中需要加入以下内容&#xff…

换行的css属性

//正常换行word-break:keep-all;word-wrap:normal;//下面这行是自动换行word-break:break-all;word-wrap:break-word;word-wrap:normal | break-word; (内容换行)normal:默认的属性值.&#xff08;允许内容顶开指定的容器边界&#xff09;.break-word:内容将在边界内换行(不截断…

基于jquery.ajax的进一步封装

这是最近写项目用到的一个小功能&#xff0c;给大家分享下&#xff0c;希望对大家有帮助。 直接上代码&#xff1a; % page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <!DOCTYPE html PUBLIC &quo…