即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

ThreadLocal 学习和进阶

编程语言 qq_26115733 9℃ 0评论
本文目录
[隐藏]

1.ThreadLocal

ThreadLocal 不是一个线程,而是线程的一个本地化变量。当工作于多线程中的对象使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的进程分配一个独立的变量副本,所以每个线程可以独立改变自己的副本,而不会影响其他线程的对应的副本。从线程的角度上来看,这个变量就是线程的一个本地变量。

  • 初始化函数 protected T initialValue() {}
  • 获取变量的值 public T get() {}
  • 设置变量的值 public void set(T value) {}
  • 移除变量的值 public void remove() {}

2.使用ThreadLocal生成一个序列号,要求不同的线程进行各自的编号。

2.1.生成序列号的类

package com.seq;

/**
 * 实现生成序列号,并不同的线程生成各自的序列号
 * @author Duoduo
 * @version 1.0
 * @date 2017/4/23 19:40
 */
public class SequencenNumber {
    //定义一个线程变量,并初始化为0
    private static  ThreadLocal seqNumber = new ThreadLocal(){
        @Override
        protected Integer initialValue() {
            return 0;
        }
    };

    /**
     * 返回下一个序列号
     * @return
     */
    public Integer getNextSeqNumber(){
        Integer curSeqNumber = seqNumber.get()+1;
        seqNumber.set(curSeqNumber);
        return  curSeqNumber;
    }

}

2.2.测试类

package com.seq;

import org.junit.Test;
import org.junit.Before;
import org.junit.After;

/**
 * SequencenNumber Tester.
 *
 * @author 
 * @version 1.0
 * @since 
四月 23, 2017

*/
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);
}
}
}

2.3.测试结果

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

转载请注明:CodingBlog » ThreadLocal 学习和进阶

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情