【线程高新】——【ThreadLocal实现线程范围的共享变量】
2013-11-13 20:57
671 查看
先说明问题:先让每个线程都有自己线程范围内的共享变量
用Map实现每个线程都有自己线程范围内的共享变量
ThreadLocal的底层就是Map
ThreadLocal装对象
更优雅的代码
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; } }
相关文章推荐
- ThreadLocal实现线程范围的共享变量
- ThreadLocal实现线程范围的共享变量
- ThreadLocal实现线程范围的共享变量
- 使用JDK提供的ThreadLocal实现线程范围的共享变量(类似于Map<Thread,Variable>)
- ThreadLocal实现线程范围的共享变量 代码示例
- ThreadLocal实现线程范围的共享变量
- ThreadLocal实现线程范围内共享变量
- Java线程总结(四):ThreadLocal实现线程范围的共享变量
- ThreadLocal实现线程范围内共享变量和对象
- 并发库应用之一 & ThreadLocal实现线程范围的共享变量
- 黑马程序员--javaSE--ThreadLocal实现线程范围的共享变量
- Thread学习(八) ThreadLocal实现线程范围内的共享变量
- ThreadLocal实现线程范围的共享变量-笔记整理4
- ThreadLocal实现线程范围的共享变量
- 多线程篇四:ThreadLocal实现线程范围内变量共享
- ThreadLocal实现线程范围的共享变量
- ThreadLocal实现线程范围的共享变量
- ThreadLocal实现线程范围的共享变量
- Java多线程编程之ThreadLocal线程范围内的共享变量
- ThreadLocal类实现线程范围内数据共享