ThreadLocal

来源:互联网 发布:大连软件职业学校 编辑:程序博客网 时间:2024/06/03 17:42

三个线程共享一个SequenceNumber,通过ThreadLocal为每个线程提供单独的副本,产生独立的序列号。

package com.gfzs.Thread;public class SequenceNumber {private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>() {public Integer initialValue() {return 0;}};public int getNextNum() {seqNum.set(seqNum.get()+1);return seqNum.get();} public static void main(String[] args) {SequenceNumber sn = new SequenceNumber();TestClient tc1 = new TestClient(sn);TestClient tc2 = new TestClient(sn);TestClient tc3 = new TestClient(sn);tc1.start();tc2.start();tc3.start();}private static class TestClient extends Thread{private SequenceNumber sn;public TestClient (SequenceNumber sn) {this.sn = sn;}public void run() {for (int i = 0; i < 3; ++i) {System.out.println("thread["+Thread.currentThread().getName()+"] sn["+sn.getNextNum()+"]");}}}}

输出

thread[Thread-0] sn[1]
thread[Thread-1] sn[1]
thread[Thread-2] sn[1]
thread[Thread-1] sn[2]
thread[Thread-1] sn[3]
thread[Thread-0] sn[2]
thread[Thread-2] sn[2]
thread[Thread-0] sn[3]
thread[Thread-2] sn[3]

参考 《精通Spring 4.x》11.2.3

原创粉丝点击