七:java中ThreadLocal共享复杂数据
2016-03-16 17:33
429 查看
前记
上一篇温习的是java中线程范围内的共享变量的ThreadLocal方式实现,这次来温习ThreadLocal共享复杂数据的情况场景及代码
项目当中往往遇到需要共享的不是一个简单的基本数据类型,而是复杂类型,这个时候我们的代码应该怎么写才够优雅呢?非优雅模式
package com.web.thread; import java.util.Random; /********************************************************************************* //* Copyright (C) 2015 Pingan (PA). All Rights Reserved. //* //* Filename: ThreadScopeShareData.java //* Revision: 1.0 //* Author: <gao yunqi> //* Created On: 2016年3月16日 //* Modified by: //* Modified On: //* //* Description: <线程范围内的共享变量ThreadLocal--复杂类> /********************************************************************************/ public class ThreadLocalTest { private static ThreadLocal<ShareData> threadLocal = new ThreadLocal<ShareData> (); 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(); ShareData shareData = new ShareData(); shareData.setName("MyName"+data); shareData.setAge(data); threadLocal.set(shareData); System.out.println(Thread.currentThread().getName() + " has put data ==>name: " + shareData.getName() + " ==>age: " + shareData.getAge()); new Step1().getData(); new Step2().getData(); } }).start(); } } static class Step1{ public void getData(){ ShareData shareData = threadLocal.get(); System.out.println("Step1 from " + Thread.currentThread().getName() + " get data ==>name: " + shareData.getName() + " ==>age: " + shareData.getAge()); } } static class Step2{ public void getData(){ ShareData shareData = threadLocal.get(); System.out.println("Step2 from " + Thread.currentThread().getName() + " get data ==>name: " + shareData.getName() + " ==>age: " + shareData.getAge()); } } } class ShareData{ private String name; private int age; /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the age */ public int getAge() { return age; } /** * @param age the age to set */ public void setAge(int age) { this.age = age; } }
优雅模式
package com.web.thread; import java.util.Random; /********************************************************************************* //* Copyright (C) 2015 Pingan (PA). All Rights Reserved. //* //* Filename: ThreadScopeShareData.java //* Revision: 1.0 //* Author: <gao yunqi> //* Created On: 2016年3月16日 //* Modified by: //* Modified On: //* //* Description: <线程范围内的共享变量ThreadLocal--复杂类> /********************************************************************************/ public class ThreadLocalTest { private static ThreadLocal<ShareData> threadLocal = new ThreadLocal<ShareData> (); 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(); ShareData.getThreadInstance().setName("MyName"+data); ShareData.getThreadInstance().setAge(data); new Step1().getData(); new Step2().getData(); } }).start(); } } static class Step1{ public void getData(){ ShareData shareData = ShareData.getThreadInstance(); System.out.println("Step1 from " + Thread.currentThread().getName() + " get data ==>name: " + shareData.getName() + " ==>age: " + shareData.getAge()); } } static class Step2{ public void getData(){ ShareData shareData = ShareData.getThreadInstance(); System.out.println("Step2 from " + Thread.currentThread().getName() + " get data ==>name: " + shareData.getName() + " ==>age: " + shareData.getAge()); } } } class ShareData{ private static ShareData shareData = null; private static ThreadLocal<ShareData> tlShareData = new ThreadLocal<ShareData>(); //参照单例模式 private ShareData(){} public static ShareData getThreadInstance(){ shareData = tlShareData.get(); if(shareData == null){ shareData = new ShareData(); tlShareData.set(shareData); } return shareData; } private String name; private int age; /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the age */ public int getAge() { return age; } /** * @param age the age to set */ public void setAge(int age) { this.age = age; } }
以上便是ThreadLocal复杂类型数据的共享
相关文章推荐
- 搭建Spring框架,实现添加数据到数据库
- [Java语言] [Leetcode] Best Time to Buy and Sell Stock 买卖股票的最佳时机
- 《分布式java运用:基础与实践》笔记1
- [Java学习] 将PDF格式文件转成二进制并生成Base64编码,将Base64编码转成PDF文件
- Spring MVC基础
- java.lang.UnsatisfiedLinkError
- SSH2之搭建struts2(一)
- [Java语言] [Leetcode] Find Minimum in Rotated Sorted Array 找旋转有序数组的最小值
- Java中内部类表现形式
- Java基础自学笔记001
- 猜生日_蓝桥杯题目_最简版
- 关于Java中文乱码与日期格式
- Struts2学习笔记(访问Web元素和Result_Type)
- JavaWeb动态导出Excel可弹出下载
- 浅谈Java中父类与子类的加载顺序
- Java操作Excel
- 学习Spring必学的Java基础知识
- java 获取时间并设置时间格式
- JAVA_SE基础——56.包的创建
- java虚拟机工具入门