ThreadLocal
ThreadLocal 不是一个线程,而是线程的一个本地化变量。当工作于多线程中的对象使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的进程分配一个独立的变量副本,所以每个线程可以独立改变自己的副本,而不会影响其他线程的对应的副本。从线程的角度上来看,这个变量就是线程的一个本地变量。
- 初始化函数 protected T initialValue() {}
- 获取变量的值 public T get() {}
- 设置变量的值 public void set(T value) {}
- 移除变量的值 public void remove() {}
使用ThreadLocal生成一个序列号,要求不同的线程进行各自的编号。
生成序列号的类
package com.seq;
/**
* 实现生成序列号,并不同的线程生成各自的序列号
* @author Duoduo
* @version 1.0
* @date 2017/4/23 19:40
*/
public class SequencenNumber {
//定义一个线程变量,并初始化为0
private static ThreadLocal<Integer> seqNumber = new ThreadLocal<Integer>(){
@Override
protected Integer initialValue() {
return 0;
}
};
/**
* 返回下一个序列号
* @return
*/
public Integer getNextSeqNumber(){
Integer curSeqNumber = seqNumber.get()+1;
seqNumber.set(curSeqNumber);
return curSeqNumber;
}
}
测试类
package com.seq;
import org.junit.Test;
import org.junit.Before;
import org.junit.After;
/**
* SequencenNumber Tester.
*
* @author <Authors name>
* @version 1.0
* @since <pre>四月 23, 2017</pre>
*/
public class SequencenNumberTest {
@Before
public void before() throws Exception {
}
@After
public void after() throws Exception {
}
/**
* Method: getNextSeqNumber()
*/
@Test
public void testGetNextSeqNumber() throws Exception {
SequencenNumber sequencenNumber = new SequencenNumber();
//创建多个线程同时创建序列号
Thread seqThread1 = new SeqTestThread(sequencenNumber);
Thread seqThread2 = new SeqTestThread(sequencenNumber);
Thread seqThread3 = new SeqTestThread(sequencenNumber);
seqThread1.start();
seqThread2.start();
seqThread3.start();
}
}
/**
* 在线程里面生成序列号
*/
class SeqTestThread extends Thread {
SequencenNumber seqNumber;
public SeqTestThread(SequencenNumber seqNumber) {
this.seqNumber = seqNumber;
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
Integer curSeqNumber = seqNumber.getNextSeqNumber();
System.out.println(Thread.currentThread().getName()+ " curSeqNumber : "+curSeqNumber);
}
}
}
测试结果
Thread-0 curSeqNumber : 1
Thread-2 curSeqNumber : 1
Thread-1 curSeqNumber : 1
Thread-2 curSeqNumber : 2
Thread-0 curSeqNumber : 2
Thread-0 curSeqNumber : 3
Thread-2 curSeqNumber : 3
Thread-1 curSeqNumber : 2
Thread-2 curSeqNumber : 4
Thread-0 curSeqNumber : 4
Thread-2 curSeqNumber : 5
Thread-1 curSeqNumber : 3
Thread-0 curSeqNumber : 5
Thread-1 curSeqNumber : 4
Thread-1 curSeqNumber : 5