- 浏览: 167114 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
mengyue0477:
最后还不忘吐槽一下 哈哈 太逗了
spring容器的懒加载lazy-init设置 -
comet0515:
不是maven工程能不能用checkstyle插件?job是一 ...
jenkins 配置checkstyle -
xfxlch:
http://docs.spring.io/spring-bo ...
NoteBook -
With_Me_Forever:
太浅了。我最近也在看着方面的资料,一起进步把。
互联网金融定义 -
xfxlch:
在http://r.m.baidu.com/6pmxgig
NoteBook
ThreadLocal基于线程的数据存储结构。ThreadLocal是类型于Map的一种数据结构,它以当前线程的ThreadLocal为key,来实现当前线程范围内的局部变量对象的共享。其保存和获取的方法是set(Object)和get()。
应用实例:
此实例就通过ThreadLocal这个对象来达到MyThreadScopeData 实例对象在当前线程范围内(这里是Module A和Module B)共享同一个对象。并且通过单例的模式,很好的屏蔽了ThreadLocal对外部模块的可见性。
Set(T)的源代码如下:
把要保存的对象保存到ThreadLocalMap这个对象中,并且以ThreadLocal本身作为key,如果此Map一开始不存在,就去初始化一个Map,然后保存值Value。
应用实例:
/** * <br> * do what you want to do and never stop it. * <br> */ package com.luch.thread; import java.util.Random; /** * @author Jack * Jul 7, 2014 * <br> */ public class ThreadScopeShareData { /** * @param args */ public static void main(String[] args) { for(int i =0; i < 2; i++) { new Thread(new Runnable(){ public void run() { int data = new Random().nextInt(); System.out.println(Thread.currentThread().getName() + " has put count:" +data); MyThreadScopeData.getInstance().setName("name"+data); System.out.println(Thread.currentThread().getName() +" MyThreadScopeData: " + MyThreadScopeData.getInstance()); new A().get(); new B().get(); } }).start(); } } static class A{ public void get(){ System.out.println("A " + Thread.currentThread().getName() + " Singlton: " + MyThreadScopeData.getInstance()); System.out.println("A " + Thread.currentThread().getName() + " has get count:" +MyThreadScopeData.getInstance().getName()); } } static class B{ public void get(){ System.out.println("B " + Thread.currentThread().getName() + " Singlton: "+MyThreadScopeData.getInstance()); System.out.println("B " + Thread.currentThread().getName() + " has get count:" +MyThreadScopeData.getInstance().getName()); } } static class MyThreadScopeData{ private String name; private int age; private MyThreadScopeData(){} //private static volatile MyThreadScopeData instance; public static /*synchronized*/ MyThreadScopeData getInstance(){ MyThreadScopeData instance = map.get(); if (instance == null) { instance = new MyThreadScopeData(); map.set(instance); } return instance; } public static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>(); public String getName() { System.out.println("getName:" + Thread.currentThread().getName() + " name=" + name + " this.name=" + this.name + " " + this.toString()); return name; } public synchronized void setName(String name) { this.name = name; System.out.println("setName:" + Thread.currentThread().getName() + " name=" + name + " this.name=" + this.name + " " + this.toString()); } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } }
此实例就通过ThreadLocal这个对象来达到MyThreadScopeData 实例对象在当前线程范围内(这里是Module A和Module B)共享同一个对象。并且通过单例的模式,很好的屏蔽了ThreadLocal对外部模块的可见性。
Set(T)的源代码如下:
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
把要保存的对象保存到ThreadLocalMap这个对象中,并且以ThreadLocal本身作为key,如果此Map一开始不存在,就去初始化一个Map,然后保存值Value。
发表评论
-
eclipse project .setting
2016-08-24 11:30 602有一个文件在.setting的目录下面: 文件名:org.ec ... -
jar命令工具
2016-01-23 20:29 688背景: 今天介绍两个jar的命令工具,对我个人来说,还是比较好 ... -
Java的按值传递
2016-01-23 19:30 555问题: 最近在看Mar ... -
Mac OS 安装java 开发环境
2016-01-03 13:00 1771我的机器是: 1. jdk1.7下载安装 jdk7:h ... -
记一次Java Rest Service Hang住的经历
2015-12-28 20:08 2698背景: 在前后端分开开发的过程中,前段的页面要调用后台Java ... -
一个String字符串的问题2
2015-12-14 14:22 610背景: 今天遇到个问题: String str = & ... -
我读重构这本书
2015-12-01 22:30 0第一点:关注变量命名。好的变量名能让读者更快更好的理解程序到底 ... -
系统log的编写
2015-11-16 09:41 0log很关键,一定要记录好对追踪问题有帮助的日志。 -
CAS 授权问题
2015-11-16 09:40 0CAS 授权问题 -
Caused by: java.lang.UnsupportedOperationException 解决方案
2015-10-21 22:09 4062背景: 今天在跑一个UnitTest,跑的过程中想在list ... -
LogBack 框架里log-access的使用
2015-10-18 16:05 7096背景: 想通过配置log-access来实现直接使用浏览器来访 ... -
how to fix "org.hamcrest.CoreMatchers.containsString cannot be resolved"
2015-09-23 23:12 3025背景: 山姆大叔比较喜欢用一些新的技术和新的特性,最近在jun ... -
java 打印金字塔
2015-08-24 00:53 781背景: 一个同事,面试应聘者喜欢用学校里学过的一个书本或者课后 ... -
纯jsp servlet 实现 upload file功能
2015-08-17 20:35 738本篇主要是简单的实现jsp servlet 的上传文件的功能, ... -
dos 命令窗口執行java 命令,帶包路徑
2015-07-26 12:16 532記錄一下,是為了自己下次再run java命令的時候,可以很快 ... -
tomcat 远程调试
2015-07-23 18:41 489背景: 我们在项目开发过程中,很多时候会遇到这样的情况:项目在 ... -
使用android studio 来开发hello world app的时候,遇到的一些坑。
2015-07-13 01:38 2160使用android studio 来开发h ... -
ThreadLocal
2015-05-11 07:22 423Java线程:深入ThreadLocal ThreadLo ... -
Hibernate Interceptor(拦截器)
2015-04-28 20:30 2418需求: 对所有操作数据库的事件,添加audit log, 此l ... -
eclipse 加入tomcat 包
2015-03-24 01:09 430...
相关推荐
"Java 中ThreadLocal实例分析" Java 中的 ThreadLocal 实例分析是指在多线程环境下,如何使用 ThreadLocal 来实现线程安全。ThreadLocal 是 Java 中的一种机制,用于在多个线程中实现变量的隔离。 在上面的代码中...
当多个线程并发执行时,每个线程都可以安全地使用自己的`Connection`实例,而不会相互干扰。 总的来说,结合JDBC的事务管理和ThreadLocal,我们可以在多线程环境中更好地实现数据库操作,确保数据的一致性,并提高...
创建ThreadLocal实例时,通常会定义一个泛型参数,代表该线程局部变量的类型。例如: ```java ThreadLocal<String> threadLocal = new ThreadLocal(); ``` ### 设置和获取值 在ThreadLocal中,`set()`方法用于...
当我们创建一个新的ThreadLocal实例时,它并不会立即分配内存,而是等到线程第一次调用`set`或`get`方法时才会为该线程创建一个副本。这个副本存储在线程的ThreadLocalMap中,这个Map是由Thread类维护的,键是...
通过创建ThreadLocal实例,我们可以为每个线程提供一个独立的变量副本,这些副本在各个线程之间互不影响,从而实现线程局部变量的功能。本文将深入探讨ThreadLocal的使用、原理以及一些实际应用中的测试案例。 ### ...
由于ThreadLocalMap使用弱引用保存键(即ThreadLocal实例),当ThreadLocal变量不再被引用时,垃圾收集器可以回收ThreadLocal实例。但是,如果ThreadLocalMap中的值(通常是对象)仍然被其他强引用保持,那么即使...
ThreadLocalMap的实现使用了弱引用(WeakReference<ThreadLocal<?>>)作为key,这是因为即使没有外部引用指向ThreadLocal实例,只要它还在ThreadLocalMap中作为key存在,垃圾收集器就不会回收ThreadLocal实例。...
1. **创建ThreadLocal实例:** 首先,你需要创建一个ThreadLocal类型的实例,这将作为你在每个线程中存储值的容器。 ```java ThreadLocal<String> threadLocal = new ThreadLocal(); ``` 2. **设置线程局部变量的...
- ThreadLocalMap使用弱引用作为键,这意味着如果线程不再引用ThreadLocal实例,即使ThreadLocal实例仍然存在,但只要没有其他引用,那么在垃圾收集时,ThreadLocal实例会被清除,相应的ThreadLocalMap中的条目也会...
每个线程都有自己的ThreadLocalMap,当创建新的ThreadLocal实例时,如果没有为当前线程创建过这个映射表,那么就会为当前线程创建一个。ThreadLocal通过get()和set()方法访问或设置线程局部变量,这些操作会直接作用...
每个线程都有自己的ThreadLocal实例,它们各自保存独立的变量副本,互不影响。ThreadLocal的主要优点在于避免了线程之间的数据共享,减少了同步的需求,从而提高了程序的性能和可读性。 ### ThreadLocal的使用方法 ...
ThreadLocal的工作原理可以这样理解:每个ThreadLocal实例都会为每个线程创建一个单独的存储空间,也就是说,当多个线程访问同一个ThreadLocal实例时,每个线程都有自己独立的副本,互不干扰。ThreadLocal并不提供...
ThreadLocal的使用方法是创建一个ThreadLocal实例,然后通过其set()方法设置线程局部变量,get()方法获取当前线程的该变量值。需要注意的是,ThreadLocal不是线程安全的,它只是保证了线程内部的隔离性,但不负责...
在ThreadLocal中,每个实例都有一个内部Map,这个Map存储了键值对,键是ThreadLocal实例,值就是线程本地的变量副本。在JDK 8之前,这个内部Map是`ThreadLocal.ThreadLocalMap`,而从JDK 8开始,改为了`...
每个线程都有自己的ThreadLocal实例,并且只能访问自己的副本,不会与其他线程的数据产生冲突,从而实现了线程间的隔离。使用ThreadLocal可以避免在多线程环境下频繁的同步操作,提高程序的效率。例如,在Web应用...
ThreadLocal的使用方法通常是创建一个ThreadLocal实例,然后在需要的地方通过它的`set()`方法设置线程局部变量的值,通过`get()`方法获取该变量的副本。在生命周期结束后,通常需要调用`remove()`方法清除线程的副本...
1. **创建ThreadLocal实例**:首先,你需要创建一个ThreadLocal实例,这是你将要存储线程局部变量的地方。例如: ```java ThreadLocal<String> threadLocalVar = new ThreadLocal(); ``` 2. **设置线程局部值**...
每个线程都拥有自己的ThreadLocal实例,存储在这个实例中的变量只对当前线程可见,其他线程无法访问。 2. **作用**:ThreadLocal主要用在多线程环境下,为每个线程提供独立的、线程私有的变量副本,避免了线程间的...