在java线程中有一个很有作用的类ThreadLocal
在网上关于ThreadLocal的理解也相当的多,文章也很多,但是很多看了都让人一头雾水,有的就讲原理,有的就说概念,而且大量的转载,却很少有实例这块的。
JDK1.5之后,java引入了泛型的概念,也为ThreadLocal引入了泛型,通过泛型可以简化多线程编程时的并发访问,使用这个工具类可以很简洁的编写出有没的多线程程序。
ThreadLocal 是Thread Local Variable(线程局部变量)的意思,线程局部变量的功能非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,使每一个想成都可以独立的改变自己的副本,而不会和其他线程的副本冲突,从线程的角度看,就好像每一个线程都完全拥有该变量
ThreadLocal 类的用法很简单,它只提供了三个方法。
T get();返回此线程局部变量中当前线程副本中的值。
void remove();删除此线程局部变量中当前线程副本中的值。
void set(T value);设置此线程局部变量中当前线程副本中的值。
下面将通过两个程序的对比来说明ThreadLocal类的作用。
下面提供两个账户类
package test7;
public class Account {
/**
* 定义一个ThreadLocal类变量
* 该变量将是一个线程局部变量,每个线程都会保留该变量的一个副本
*/
private ThreadLocal<String> name = new ThreadLocal<String>();
public String getName() {
return this.name.get();
}
public void setName(String name) {
this.name.set(name);
}
}
package test7;
public class Account1 {
/**
* 定义一个ThreadLocal类变量
* 该变量将是一个线程局部变量,每个线程都会保留该变量的一个副本
*/
private String name ;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
以上的账户类中只有name这一个属性,不同的是前者使用了ThreadLocal来存贮,后者就是一个String
下面是线程类
package test7;
public class Thread2 extends Thread{
private Account1 account;
public Thread2(Account1 account,String name){
super(name);
this.account = account;
}
@Override
public void run(){
for (int i = 0; i < 10; i++) {
//当i为6的时候将当前账户名换成当前线程名
if(i == 6){
this.account.setName(getName());
}
System.out.println(account.getName()+"账户的i的值为"+i);
}
}
}
这个类,是对每个账户进行操作,当运行到6的时候就将账户名改为当前线程的名字(getName()是Thread类中定义的方法)。
场景类是这样的
package test7;
public class Test7 {
public static void main(String[] args) {
Account1 account = new Account1();
Thread thread1 = new Thread2(account,"xby");
Thread thread2 = new Thread2(account,"gengu");
thread1.start();
thread2.start();
}
}
如果使用Account1的话会出现什么结果?
null账户的i的值为0
null账户的i的值为1
null账户的i的值为2
null账户的i的值为3
null账户的i的值为4
null账户的i的值为5
xby账户的i的值为6
xby账户的i的值为7
xby账户的i的值为8
xby账户的i的值为9
xby账户的i的值为0
xby账户的i的值为1
xby账户的i的值为2
xby账户的i的值为3
xby账户的i的值为4
xby账户的i的值为5
gengu账户的i的值为6
gengu账户的i的值为7
gengu账户的i的值为8
gengu账户的i的值为9
如果使用Account类那么会出现什么结果?
null账户的i的值为0
null账户的i的值为1
null账户的i的值为2
null账户的i的值为3
null账户的i的值为4
null账户的i的值为5
xby账户的i的值为6
xby账户的i的值为7
xby账户的i的值为8
xby账户的i的值为9
null账户的i的值为0
null账户的i的值为1
null账户的i的值为2
null账户的i的值为3
null账户的i的值为4
null账户的i的值为5
gengu账户的i的值为6
gengu账户的i的值为7
gengu账户的i的值为8
gengu账户的i的值为9
不知道你们看出差别没有,就是后者相对非常独立,第一次accout变量的name属性改变之后没有使第二个线程中的account name变量改变。还是null,这回应该有点了解了吧。第一次运行的时候,线程1改变了线程2中account变量的name属性。
这样就好像,两个线程各拥有一个account实例一样。
但是ThreadLocal不能替代同步机制,因为他不能解决同步问题,只能解决共享安全问题,从根本上避免了多个线程之间的资源共享,所以也就不需要同步了。
分享到:
相关推荐
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
- **代码可读性和可维护性**:`ThreadLocal`的使用可能使代码变得复杂,不易于理解和调试,尤其是在多线程环境下的问题排查。 总结,`ThreadLocal`是Java中用于实现线程局部变量的工具,它提供了一种简单的方式在多...
ThreadLocal的生命周期是与线程绑定的。当线程结束时,与其关联的ThreadLocal变量不会自动清除,可能会导致内存泄漏。因此,推荐在不再使用ThreadLocal时显式调用`remove()`方法。 ```java threadLocal.remove(); `...
理解ThreadLocal的工作原理和使用方法对于编写高效、安全的多线程程序至关重要。 ### ThreadLocal简介 ThreadLocal并非一个线程对象,而是一个线程局部变量的容器。每个线程都有自己的ThreadLocal实例,它们各自...
**标题:“JDK的ThreadLocal理解(一)使用和测试”** **正文:** ThreadLocal是Java中的一个非常重要的线程安全工具类,它在多线程编程中扮演着独特的角色。通过创建ThreadLocal实例,我们可以为每个线程提供一个...
理解ThreadLocal的工作原理以及如何正确使用它是Java并发编程的关键。 首先,ThreadLocal类的主要作用是为每个线程创建一个单独的变量副本。这意味着在同一个ThreadLocal变量中,不同的线程可以存储各自独立的值,...
### 正确理解ThreadLocal:深入解析其工作原理与应用场景 #### 一、ThreadLocal的基本概念 `ThreadLocal`是Java平台提供的一种线程局部变量的解决方案,它为每一个使用该变量的线程都提供了独立的变量副本,使得每...
ThreadLocal深度理解
例如,Spring Security 中的 ThreadLocalSecurityContextHolderStrategy 类就是使用 ThreadLocal 来实现的。 三、如何创建一个 ThreadLocal 实例 创建一个 ThreadLocal 实例非常简单,只需要使用 private static ...
在使用ThreadLocal时,理解其工作原理和限制是非常重要的。合理的使用能够帮助我们编写出更高效、更易于维护的多线程程序,但也要避免滥用,因为它可能会引入难以察觉的并发问题和内存管理问题。
然而,ThreadLocal在理解和使用过程中容易产生一些误区,这里我们将详细探讨这些常见的误解。 误区一:ThreadLocal是Java线程的一个实现 ThreadLocal并非Java线程的实现,它只是一个工具类,用于创建线程局部变量。...
Java中ThreadLocal工具类(解决多线程程序中并发问题的一种新思路,主要为参数的拷贝问题),感兴趣的话可以查看博文,博文地址:http://blog.csdn.net/otengyue/article/details/38459327
### 理解ThreadLocal #### 一、ThreadLocal简介 `ThreadLocal`是一个非常有用的类,它在Java 1.2版本中...理解`ThreadLocal`的工作原理及其使用方法,可以帮助我们在多线程编程中更加高效地处理数据和状态管理问题。
在Java编程中,ThreadLocal是线程局部变量的类,它提供了一种在多线程环境中为每个线程创建和维护独立副本的机制。ThreadLocal主要用于解决线程间的数据隔离问题,确保各线程拥有自己的变量副本,避免了数据共享带来...
本篇文章将聚焦于Spring事务处理中ThreadLocal的使用,以及如何通过源码理解和应用这个工具。 首先,了解Spring事务管理的基本概念。在多线程环境中,事务管理是至关重要的,它负责确保一组数据库操作要么全部成功...
1. 多线程:理解ThreadLocal的使用必须建立在对多线程的理解基础上,包括线程的创建、执行、同步机制等。 2. 并发编程:ThreadLocal是解决并发问题的一种策略,它提供了一种避免共享状态的方式,减少了锁的使用。 3....
at 中专门为每一个 web 应用...理解 `ThreadLocal` 的工作原理以及它如何与类加载器交互,是避免此类问题的关键。在实际开发中,应当养成良好的编程习惯,如使用后及时清理 `ThreadLocal` 变量,以防止内存资源的浪费。
2. **内部类ThreadLocalMap**: `ThreadLocalMap`是`ThreadLocal`类中的一个内部静态类,它是一个定制的哈希映射,专门用于存储线程局部变量。每个`Thread`对象都包含一个`ThreadLocalMap`实例,用于保存该线程的`...
ThreadLocal是Java中用于线程局部变量的一个工具类,它允许在多线程环境下为每个线程创建独立的变量副本,从而避免了线程之间的数据...理解ThreadLocal的工作原理和使用方法,对于编写高效、安全的并发程序至关重要。