我们先来看下synchronized和ThreadLocal的区别:
他们都可以用来处理多线程并发问题的:
synchronized:同步,只有一个资源,限制线程的读取来同步,即同一时间只有某个线程去操作这个资源(以时间换空间)
ThreadLocal:是Thread的一个局部变量,注意 它不是一个线程,是用来处理多线程并发问题,它为每个线程复制了对应的一个副本,这样每个线程都可以
独立的操作了。(以空间换时间)
void set(T value) 将此线程局部变量的当前线程副本中的值设置为指定值
void remove() 移除此线程局部变量当前线程的值
protected T initialValue() 返回此线程局部变量的当前线程的“初始值”
T get() 返回此线程局部变量的当前线程副本中的值
现在来看下 ,它的具体使用:
public static class number {
ThreadLocal<Integer> mThreadLocal = new ThreadLocal<Integer>();
public Integer getNumber() {
if (mThreadLocal.get() == null)
mThreadLocal.set(0);
mThreadLocal.set(mThreadLocal.get()+1);
return mThreadLocal.get();
}
}
public static class myThread extends Thread {
private number mNumber;
public myThread(number n) {
this.mNumber = n;
}
@Override
public void run() {
for (int i = 0; i< 3; i++) {
System.out.print("currendThreadId = "+Thread.currentThread().getId()
+" number = "+this.mNumber.getNumber() + "\n");
}
}
}
public static void main(String[] args) {
number mNumber = new number();
myThread t1 = new myThread(mNumber);
myThread t2 = new myThread(mNumber);
myThread t3 = new myThread(mNumber);
t1.start();
t2.start();
t3.start();
}
每个线程都可以独立的打印出1,2,3,线程之间互不干扰。