Java之ThreadLocal

1 ThreadLocal接口出现原因

使用ThreadLocal保存当前线程的变量值,这样你想获取该变量的值的时候,获取到的都是本线程的变量值,不会获取到其他线程设置的值早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序

 

 

 

2 接口主要的API

void set(Object value)设置当前线程的线程局部变量的值。
public Object get()该方法返回当前线程所对应的线程局部变量。
public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。
protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。

 

 

 

3 测试Demo

//'main' method must be in a class 'Rextester'.
//Compiler version 1.8.0_111import java.util.*;
import java.lang.*;class Rextester {  //通过匿名内部类覆盖ThreadLocal的initialValue()方法,指定初始值  private static ThreadLocal<Integer> tLocal = new ThreadLocal<Integer>() {  public Integer initialValue() {  return 0;  }  };  //获取下一个序列值  public int getNextNum() {  tLocal.set(tLocal.get() + 1);  return tLocal.get();  }  public static void main(String args[]) {Rextester rt = new Rextester();  // 3个线程共享rtTestClient t1 = new TestClient(rt);  TestClient t2 = new TestClient(rt);  TestClient t3 = new TestClient(rt);  t1.start();  t2.start();  t3.start();  }private static class TestClient extends Thread {  private Rextester rt;  public TestClient(Rextester rt) {  this.rt = rt;  }  public void run() {  for (int i = 0; i < 3; i++) {  // 每个线程打出3个序列值  System.out.println("thread[" + Thread.currentThread().getName() + "] --> rt["  + rt.getNextNum() + "]");  }  }  }  
}

 

 

 

4 运行结果

thread[Thread-0] --> rt[1]
thread[Thread-2] --> rt[1]
thread[Thread-1] --> rt[1]
thread[Thread-0] --> rt[2]
thread[Thread-1] --> rt[2]
thread[Thread-0] --> rt[3]
thread[Thread-2] --> rt[2]
thread[Thread-1] --> rt[3]
thread[Thread-2] --> rt[3]

 

 

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

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

相关文章

server如何调用 thrift_Thrift总结(二)如何快速创建自己的RPC服务

前面介绍了thrift 基础的东西&#xff0c;怎么写thrift 语法规范编写脚本&#xff0c;如何生成相关的语言的接口。不清楚的可以看这个《Thrift总结(一)介绍》。做好之前的准备工作以后&#xff0c;下面就开始如何用Thrift写RPC接口。如何用Thrift写RPC接口1. 打开之前下载的thr…

Hello Playwright:(2)简化部署方式

前言上次的文章Hello Playwright&#xff1a;(1)从开发到部署发表后&#xff0c;有网友留言问&#xff0c;有不有简化部署的方式&#xff1a;下面&#xff0c;提供 2 种可行的方案。方案 1. Copy其实 Playwright 默认是到C:\Users\用户名\AppData\Local\ms-playwright文件夹下查…

ArcGIS实验教程——实验十六:空间数据查询

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 一、实验描述 空间数据库查询定义:从空间数据库中找出所有满足属性约束条件和空间约束条件的地理对象。 二、实验内容 (一)属性查询 1、简单查询 2、SQL查询 (二)图形查询 1、点查询 2…

C++入门指南及实战 第一步 概述及经典HelloWorld

本系列文章环境及学习门槛 编程基础&#xff1a;无年龄&#xff1a;具有一定的逻辑思维英文&#xff1a;不要求数学&#xff1a;不要求学习时长&#xff1a;每天一篇&#xff0c;一周4-5篇即可&#xff0c;每篇最多1小时死记硬背&#xff1a;不需要&#xff0c;理解至上本机环…

【数学题】男女的比例

在一个重男轻女的国家里&#xff0c;每家每户都想生男孩。若一户人家生了一个男孩&#xff0c;就不会再生了。若一家生了一个女孩&#xff0c;便会再生一个&#xff0c;直到生下男孩为止。请问这个国家(有无限多的人民)的男女比例是多少?答案&#xff1a;1比1。在某一户人家中…

为什么云服务器没西南的_去年“双11“我买的那台云服务器

一、为什么会买云服务器为什么初学者需要一台云服务器&#xff1f;从我自己那仅有的一点经验来看&#xff0c;重点无非这一个词&#xff1a;实践。细数一下初学者拥有一台云服务器的好处&#xff1a;学习操作系统、熟悉环境大部分初学者在本地使用的是windows系统&#xff0c;在…

Java线程安全以及线程安全的实现方式和内存模型(JMM)

一、了解几个概念 1&#xff09;临界区&#xff1a; 临界区指的是一个访问共用资源&#xff08;例如&#xff1a;共用设备或是共用存储器&#xff09;的程序片段&#xff0c;而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时&#xff0c;其他线程或是进…

animate 实现滑动切换效果

今天和大家分享一下用 animate 实现滑动切换效果的小例子 ------- 来自<一只有梦想的前端小白> 大家都知道jQuery 提供的有一下几种方法能够实现滑动效果&#xff1a; slideDown()slideUp()slideToggle()但是以上的滑动不太方便控制其滑动的方向&#xff0c;所以我们还是…

[不一样的依赖注入]通过递归实现容器里依赖注入

递归实现依赖注入创建所需的依赖服务类1public class Test2{3 public void PrintTest()4 {5 Console.WriteLine("Hello World");6 }7}89public class Test2 10{ 11 private readonly Test _test; 12 13 public Test2(Test test) 14 { 15 …

ArcGIS实验教程——实验十七:缓冲区分析(Buffer Analysis)

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 【实验描述】 缓冲区(Buffer)是为了识别某一地理实体对周围地物的影响而在其周围建立的一定宽度多边形区域,缓冲区分析(Buffer Analysis)是用来确定不同地理要素的空间临近性或接近程度的一种分…

Java之jdk和CGLib实现动态代理

1 jdk实现动态代理源码实现 这里需要用到InvocationHandler接口 public interface Hello {public void sayHello(); } public class HelloImpl implements Hello {Overridepublic void sayHello() {System.out.println("hello word");} }import java.lang.reflect…

从Visual Studio中生成Linux设备

本文讲的是从Visual Studio中生成Linux设备&#xff0c;【IT168 云计算频道】近日Novell发布了SUSE Studio&#xff1a;一个用于创建Linux设备&#xff08;appliance&#xff09;的工具。与此同时&#xff0c;Mono小组创建了一个插件以从Visual Studio中生成支持SUSE的设备。 …

C++入门指南及实战 第二步 HelloWorld及扩展详解

回顾 在上一节中&#xff0c;我们编写了如下代码&#xff0c;完成了 HelloWorld程序的编写&#xff1a; #include<iostream> using namespace std;int main(){cout <<"Hello World";return 0; }本小节将会对该代码进行讲解&#xff0c;并且解释一下专业…

2560x1600分辨率高吗_做设计还弄不清分辨率和像素之间的关系,来了解下他们是怎么换算...

许多同学都在问我关于像素的问题&#xff0c;为什么印刷时要300分辨率以上&#xff1f;网页为什么72就够了&#xff1f;做户外喷绘30&#xff0c;甚至巨幅画面20就上了。关于这些还是很多人不知道的&#xff0c;要不也不会被卖手机的忽悠&#xff0c;各大手机推销员拿着手机大声…

使用 fixture 机制重构 appium_helloworld

一、前置说明 在 pytest 基础讲解 章节,介绍了 pytest 的特性和基本用法,现在我们可以使用 pytest 的一些机制,来重构 appium_helloworld 。 appium_helloworld 链接: 编写第一个APP自动化脚本 appium_helloworld ,将脚本跑起来 代码目录结构: pytest.ini 设置: [pyt…

linux程序调试命令strace

strace命令用法详解: strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界&#xff0c;进程不能直接访问硬件设备&#xff0c;当进程需要访问硬件设备(比如读取磁盘文件&#xff0c;接收网络数据等等)时&#xff0c;必须由用户态模式切换至内核态模式&#xff0…

Tomcat相关 -- 内存设置

java内存溢出详解 一、常见的java内存溢出 1、java.lang.OutOfMemmoryError : Java heap space -- JVM Heap &#xff08;jvm 堆溢出&#xff09; JVM启动时自动设置JVM Heap的值&#xff0c;其初始空间(即 -Xms)是物理内存的1/64&#xff0c;最大空间(-Xms)不可超过物理内存。…

CoreWCF 1.0 正式发布,支持 .NET Core 和 .NET 5+ 的 WCF

CoreWCF 项目组正式发布 1.0 版本的 CoreWCF, 这是面向 .NET Core 平台的 WCF 移植版本。它支持 SOAP、NetTCP 和 WSDL 的相同实现。在代码中的使用方式于 WCF 相同&#xff0c;但是升级到使用 ASP.NET Core 作为服务宿主&#xff0c;并工作在 .NET Core 平台上。这是该项目的第…

【经典回放】多种语言系列数据结构算法:快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过…

表头合并_多个Excel表格合并数据麻烦?试试Power Query轻松帮你解决

Hi!大家好&#xff01;欢迎来到小龙自修室&#xff01;又到了小龙分享时间&#xff01;(今天的内容有点多&#xff0c;希望各位看官一定要看到最后&#xff01;有惊喜)上一篇文字小龙和大家一起制作了一个限定数据内容录入的电子表格&#xff0c;我的表格我做主&#xff01;表格…