ThreadLocal 学习

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
发布了54 篇原创文章 · 获赞 15 · 访问量 12万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章