您的位置:首页 > 其它

【线程高新】——【ThreadLocal实现线程范围的共享变量】

2013-11-13 20:57 671 查看
先说明问题:先让每个线程都有自己线程范围内的共享变量

package com.xiaozhi.threadlocal;

import java.util.Random;

public class Test {

private static int data=0;
public static void main(String[] args) {
new Thread(){
public void run() {
data=new Random().nextInt();
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();

new Thread(){
public void run() {
data=new Random().nextInt();
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
}

static class A{

public void get()
{
System.out.println(Thread.currentThread().getName()+"new A().get():"+data);
}
}
static class B{

public void get()
{
System.out.println(Thread.currentThread().getName()+"new B().get():"+data);
}
}
}




用Map实现每个线程都有自己线程范围内的共享变量

package com.xiaozhi.threadlocal;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class Test1 {

private static Map<Thread,Integer>map=new HashMap<Thread, Integer>();
public static void main(String[] args) {
new Thread(){
public void run() {
int data=new Random().nextInt();
map.put(Thread.currentThread(),data);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();

new Thread(){
public void run() {
int data=new Random().nextInt();
map.put(Thread.currentThread(),data);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
}

static class A{

public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new A().get():"+map.get(Thread.currentThread()));
}
}
static class B{

public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new B().get():"+map.get(Thread.currentThread()));
}
}
}




ThreadLocal的底层就是Map

package com.xiaozhi.threadlocal;

import java.util.Random;

public class Test2 {

private static ThreadLocal<Integer> threadLocal=new ThreadLocal<Integer>();
public static void main(String[] args) {
new Thread(){
public void run() {
int data=new Random().nextInt();
threadLocal.set(data);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();

new Thread(){
public void run() {
int data=new Random().nextInt();
threadLocal.set(data);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
}

static class A{

public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new A().get():"+threadLocal.get());
}
}
static class B{

public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new B().get():"+threadLocal.get());
}
}
}


ThreadLocal装对象

package com.xiaozhi.threadlocal;

import java.util.Random;

public class Test3 {

private static ThreadLocal<Person> threadLocal=new ThreadLocal<Person>();
public static void main(String[] args) {
new Thread(){
public void run() {
int data=new Random().nextInt();
Person person=new Person();
person.setName("xiaozhi"+data);
person.setAge(data);
threadLocal.set(person);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();

new Thread(){
public void run() {
int data=new Random().nextInt();
Person person=new Person();
person.setName("xiaozhi"+data);
person.setAge(data);
threadLocal.set(person);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
}

static class A{

public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new A().get():"+threadLocal.get().getName()+":"+threadLocal.get().getAge());
}
}
static class B{

public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new B().get():"+threadLocal.get().getName()+":"+threadLocal.get().getAge());
}
}
}

class Person{
private String name;
private int age;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}


更优雅的代码

package com.xiaozhi.threadlocal2;

import java.util.Random;

public class Test4 {

public static void main(String[] args) {
new Thread(){
public void run() {
int data=new Random().nextInt();
Person person=Person.getPersonInstance();
person.setName("xiaozhi"+data);
person.setAge(data);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();

new Thread(){
public void run() {
int data=new Random().nextInt();
Person person=Person.getPersonInstance();
person.setName("xiaozhi"+data);
person.setAge(data);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
}

static class A{

public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new A().get():"+ Person.getPersonInstance().getName()+":"+ Person.getPersonInstance().getAge());
}
}
static class B{

public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new B().get():"+ Person.getPersonInstance().getName()+":"+ Person.getPersonInstance().getAge());
}
}
}

class Person{
private Person(){}
private static ThreadLocal<Person> threadLocal=new ThreadLocal<Person>();
public static Person getPersonInstance()
{
Person person=threadLocal.get();
if(person==null)
{
person=new Person();
threadLocal.set(person);
}
return person;
}

private String name;
private int age;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: