package com.e2u.thread; class SerialNum { // The next serial number to be assigned public static int nextSerialNum = 0; @SuppressWarnings("unchecked") public static ThreadLocal serialNum = new ThreadLocal() { protected synchronized Object initialValue() { return new Integer(nextSerialNum++); } }; public static int get() { return ((Integer) (serialNum.get())).intValue(); } } public class ThreadLocalTest extends Thread { public ThreadLocalTest(String name) { setName(name); } private int num; public void run() { num = SerialNum.get(); print(SerialNum.get()); SerialNum.serialNum.set(new Integer(num + 100)); print(SerialNum.get()); print(SerialNum.nextSerialNum); } private void print(int x) { print(String.valueOf(x)); } private void print(String str) { System.out.println("[" + this.getName() + "]" + str); } public static void main(String[] args) { int len = 7; ThreadLocalTest[] tlt = new ThreadLocalTest[len]; for(int i = 0; i < len; i++) { tlt[i] = new ThreadLocalTest(String.valueOf(i+1)); } for(int i = 0; i < len; i++) { tlt[i].start(); } try { sleep(10000); } catch (InterruptedException e1) { e1.printStackTrace(); } } }