java中ThreadLocal的认识

在java多线程中我们经常看到的保证线程安全的关键字为ThreadLocal、volatile、synchronized三个术语。

    synchronized:

    在以往的开发中无论遇见什么形式的并发访问我最先想到的就是synchronized,synchronized能够保证在并发环境中程序的同步执行,防止并发问题,但是synchronized带来的确实性能的消耗。

    volatile:

    该关键字我没有怎么使用过,从各大论坛我们可以知道volatile保证同一变量在多个线程中保持数据一致性,我个人理解volatile更适合使用在包含信号、开关功能性的开发中。

    ThreadLocal:

    ThreadLocal更像是一种工具,ThreadLocal可以获取到当前线程中保存的数据信息,同一变量在不同线程中含有自己的副本,各线程之间没有任何联系。假如存在两个线程使用到ThreadLocal声明的一个变量,则在这两个线程中会同时存在两个副本,线程可以修改自己的值,不会引起并发修改等问题。

public class ThreadUtils {

//声明一个ThreadLocal 变量(未指定枚举类型,可以存放任意类型的变量)

public static ThreadLocal cutrrentThreadHandler=new ThreadLocal();

public static Object get(){
return cutrrentThreadHandler.get();
}

public static void set(Object o){
cutrrentThreadHandler.set(o);
}

}



public class ThreadTest implements Runnable {



public ThreadTest(int num) {
this.num = num;
}
private int num;
@Override
public void run() {

try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String handler=(String)ThreadUtils.get();
if(handler==null){
ThreadUtils.set("Thread"+num);
}
System.out.println(ThreadUtils.get());

ThreadUtils.set(ThreadUtils.get()+"---2222");
System.out.println(ThreadUtils.get());
}


}



public class ThreadLocalTest {


public static void main(String[] args) {
for(int i=0;i<20;i++){
ThreadTest test=new ThreadTest(i);
new Thread(test).start();
}
System.out.println("------");
}

}


在主线程中创建20个子线程ThreadTest ,子线程同时修改ThreadLocal的值,再显示各线程的数据,结果显示线程间没有相互影响。

阅读更多
文章标签: ThreadLocal java 并发
个人分类: java多线程
下一篇NODEJS调用C的dll
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭