文档章节

ThreadScopeShareData(线程范围内数据共享之加深)

大强森
 大强森
发布于 2017/04/26 21:30
字数 502
阅读 14
收藏 0
package ThreadDemo.it_1;

//线程范围内的数据共享问题
//数据放在对象中,每条线程身上都有自己的数据.互不干涉的操作
public class ThreadScopeShareData5 {
	static ThreadLocal<person> tl = new ThreadLocal<person>();

	public static void main(String[] args) {
		for (int i = 0; i < 2; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					person p = new person("张飞", 40);
					tl.set(p);
					new Name().printName();
					new Age().printAge();
				}
			}, "线程1").start();

			//

			new Thread(new Runnable() {
				@Override
				public void run() {
					person p = new person("关羽", 45);
					tl.set(p);
					new Name().printName();
					new Age().printAge();
				}
			}, "线程2").start();

		}

	}

	// 获取姓名的模块
	static class Name {
		String name;

		public void printName() {
			System.out.println("线程是:" + Thread.currentThread().getName() 
					+ ";对象姓名:" + tl.get().getName());
		}
	}

	// 获取年龄的模块
	static class Age {
		int age;

		public void printAge() {
			System.out.println("线程是:" + Thread.currentThread().getName() 
					+ ";对象年龄:" + tl.get().getAge());
		}
	}

	//数据类,
	static class person {
		String name;
		int age;

		person(String name, int age) {
			this.name = name;
			this.age = age;
		}

		public String getName() {
			return name;
		}

		public int getAge() {
			return age;
		}

	}
}

第二种相对较专业点的做法:

单例设计模式和ThreadLocal类的结合

import java.util.Random;

//线程范围内的数据共享问题
//数据放在对象中,每条线程身上都有自己的数据.互不干涉的操作
//线程启动,得到数据对象后再访问其他模块,数据都仅仅是自己身上这份数据,每个线程都有自己的的据
//用懒汉式设计模式
public class ThreadScopeShareData6 {
	public static void main(String[] args) {
		for (int i = 0; i < 2; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					person p = person.getPerson();
					new Name().printName();
					new Age().printAge();
				}
			}).start();

			//
			new Thread(new Runnable() {
				@Override
				public void run() {
					person p = person.getPerson();
					new Name().printName();
					new Age().printAge();
				}
			}).start();

		}

	}

	// 获取姓名的模块
	static class Name {
		String name;

		public void printName() {
			System.out.println("线程是:" + Thread.currentThread().getName() 
					+ ";对象姓名:" + person.getPerson().getName());
		}
	}

	// 获取年龄的模块
	static class Age {
		int age;

		public void printAge() {
			System.out.println("线程是:" + Thread.currentThread().getName() 
					+ ";对象年龄:" + person.getPerson().getAge());
		}
	}

	//数据类,
	static class person {
		private String name;
		private int age;

		private person() {
		}

		private static ThreadLocal<person> tl_person = 
				new ThreadLocal<person>();
		private static person p = null;

		public static person getPerson() {
			p = tl_person.get();
			if (p == null) {
				p = new person();
				p.name = Thread.currentThread().getName();
				p.age = new Random().nextInt(100);
				tl_person.set(p);
			}
			return p;
		}

		public String getName() {
			return name;
		}

		public int getAge() {
			return age;
		}

	}
}

 

© 著作权归作者所有

大强森
粉丝 2
博文 24
码字总数 9681
作品 0
奉贤
程序员
私信 提问
java基础巩固笔记(5)-多线程之共享数据

java基础巩固笔记(5)-多线程之共享数据 标签: java [TOC] 本文主要总结线程共享数据的相关知识,主要包括两方面:一是某个线程内如何共享数据,保证各个线程的数据不交叉;一是多个线程间如何...

brianway
2016/02/06
129
0
Java基础巩固笔记(7)-多线程之共享数据

Contents java基础巩固笔记(5)-多线程之共享数据 线程范围内共享数据 多线程访问共享数据 本文主要总结线程共享数据的相关知识,主要包括两方面:一是某个线程内如何共享数据,保证各个线程的...

卟想苌亣
2017/12/04
0
0
Java多线程2-多个线程之间共享数据

线程范围的共享变量 多个业务模块针对同一个static变量的操作 要保证在不同线程中 各模块操作的是自身对应的变量对象 模块A ,B都需要访问static的变量data 在线程0中会随机生成一个data值 ...

香沙小熊
2018/11/26
0
0
线程--ThreadLocal

线程范围内的共享变量是指对同一个变量,几个线程同时对它进行写和读操作,我们希望的是同一个线程读到的数据就是它自己写进去的数据 1.可以采用在读和写操作前面加上synchronized修饰符 pu...

进击的_渣渣
2014/07/10
0
0
线程范围内共享变量的概念与作用

一、图解 二、多个线程访问共享对象和数据的方式 1、如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做。 2、如果每...

哎小艾
2018/01/16
1
0

没有更多内容

加载失败,请刷新页面

加载更多

rsync工具常用选项以及同步的两种方式

rsync -av /etc/passwd /tmp/1.txt #rsync的本机传输写法 rsync -av /tmp/1.txt 192.168.188.128:/tmp/2.txt #rsync的远程传输rsync格式rsync [OPTION] … SRC ......

林怡丰
今天
3
0
GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238

GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238 (Address already in use) 官方文档虽然有相同的问题,但是对我的问题没起作用…… 后面发现自己手贱...

wenzhizhong
昨天
3
0
REST接口

文章来源 https://zhuanlan.zhihu.com/p/28674721?group_id=886181549958119424 http://www.ruanyifeng.com/blog/2014/05/restful_api.html REST 对请求的约定 REST 用来规范应用如何在 HTTP......

Airship
昨天
6
0
Spring Cloud Config 统一配置中心

Spring Cloud Config 统一配置中心 一、统一配置中心 统一管理配置 通常,我们会使用配置文件来管理应用的配置。如一个 Spring Boot 的应用,可以将配置信息放在 application.yml 文件中,如...

非摩尔根
昨天
6
0
android ------ AAPT2 error: check logs for details解决方法

AAPT 是全称是 Android Asset Packaging Tool,它是构建 App,甚至是构建 Android 系统都必不可少的一个工具。它的作用是将所有资源文件压缩打包到Android APK 当中。我们在 Android SDK 目录...

切切歆语
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部