首页 > 代码库 > 线程范围内共享变量的概念与作用演进方式
线程范围内共享变量的概念与作用演进方式
/** * * @描述: 线程范围内共享变量的概念与作用 . * @作者: Wnj . * @创建时间: 2017年5月15日 . * @版本: 1.0 . */public class ThreadLocalTest { private static ThreadLocal<Integer> x = new ThreadLocal<Integer>(); private static ThreadLocal<MyThreadScopeData> myThreadScopeData = http://www.mamicode.com/new ThreadLocal<MyThreadScopeData>(); public static void main(String[] args) { for(int i=0;i<2;i++){ new Thread(new Runnable(){ @Override public void run() { int data = http://www.mamicode.com/new Random().nextInt(); System.out.println(Thread.currentThread().getName() + " has put data :" + data); x.set(data);/* MyThreadScopeData myData = http://www.mamicode.com/new MyThreadScopeData();"name" + data); myData.setAge(data); myThreadScopeData.set(myData);*/ MyThreadScopeData.getThreadInstance().setName("name" + data); MyThreadScopeData.getThreadInstance().setAge(data); new A().get(); new B().get(); } }).start(); } } static class A{ public void get(){ int data =http://www.mamicode.com/ x.get(); System.out.println("A from " + Thread.currentThread().getName() + " get data :" + data);/* MyThreadScopeData myData = http://www.mamicode.com/myThreadScopeData.get();;"A from " + Thread.currentThread().getName() + " getMyData: " + myData.getName() + "," + myData.getAge());*/ //获取与本线程有关的实例 MyThreadScopeData myData =http://www.mamicode.com/ MyThreadScopeData.getThreadInstance(); System.out.println("A from " + Thread.currentThread().getName() + " getMyData: " + myData.getName() + "," + myData.getAge()); } } static class B{ public void get(){ int data =http://www.mamicode.com/ x.get(); System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data); MyThreadScopeData myData = MyThreadScopeData.getThreadInstance(); System.out.println("B from " + Thread.currentThread().getName() + " getMyData: " + myData.getName() + "," + myData.getAge()); } }}class MyThreadScopeData{ private MyThreadScopeData(){} public static /*synchronized*/ MyThreadScopeData getThreadInstance(){ //此时的map.get是获取自身的变量,当多个线程同时进来时,获取的是线程本身的变量,所以此种方式不需要加synchronized MyThreadScopeData instance = map.get(); if(instance == null){ //一个线程进来,判断==null,这时候还没有赋值,刚好这时候被CPU调度到另一个线程,也判断==null //那么会被new 两次 instance = new MyThreadScopeData(); map.set(instance); } return instance; } //private static MyThreadScopeData instance = null;//new MyThreadScopeData(); private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>(); 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; }}
线程范围内共享变量的概念与作用演进方式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。