ThreadLocalスレッド内共有変数の実装

2121 ワード

package com.cn.gbx;



import java.util.Date;

import java.util.Random;

import java.util.Timer;

import java.util.TimerTask;



public class TestThread {

	static class A{

		public void get() {

			User user = User.getInstance();

			System.out.println("A from " + Thread.currentThread().getName() + " get data:" + user.getName() + " : " + user.getPassword());

		}

	}

	static class B{

		public void get(){

			User user = User.getInstance();

			System.out.println("B from " + Thread.currentThread().getName() + " get data:" + user.getName() + " : " + user.getPassword());

		}

	}

	public static void main(String[] args) {

		for (int i = 0; i < 2; ++i) {

			new Thread(

				new Runnable() {

					@Override

					public void run() {

						int data = new Random().nextInt();

						System.out.println(Thread.currentThread().getName() + " : data = " + data);

						User.getInstance().setName("name:" + data);

						User.getInstance().setPassword("p:" + data);

						new A().get();

						new B().get();   

						//A,B  ,  connection 

					}

				}

			).start();

		}

	}

}



class User{



	//    ThreadLocal  Map key 

	private static ThreadLocal<User> threadLocal = new ThreadLocal<User>();

	private User() {}

	public static User getInstance() {

		User user = threadLocal.get();

		if (user == null) {

			user = new User();

			threadLocal.set(user);

		}

		return user;

	}

	

	private String name;

	private String password;

	public String getName() {

		return name;

	}

	public void setName(String name) {

		this.name = name;

	}

	public String getPassword() {

		return password;

	}

	public void setPassword(String password) {

		this.password = password;

	}

}

 :



Thread-1 : data = 1362065454

Thread-0 : data = 1208952694

A from Thread-0 get data:name:1208952694 : p:1208952694

A from Thread-1 get data:name:1362065454 : p:1362065454

B from Thread-1 get data:name:1362065454 : p:1362065454

B from Thread-0 get data:name:1208952694 : p:1208952694