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