在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的值,再显示各线程的数据,结果显示线程间没有相互影响。