`

多线程课程002:线程范围内的共享变量

 
阅读更多
package cn.itcast.heima2;

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


//单一条线程,这条线程所产生的数据由在这条线程new出来的对象共享
//本题中,线程1产生的数据a,由A对象和B对象使用
//线程2产生的数据b,由A对象和B对象使用
public class ThreadScopeShareData {

//	private static int data = 0;
	private static Map<Thread, Integer> threadData = new HashMap<Thread, Integer>();

	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();
					System.out.println(Thread.currentThread().getName()
							+ " has put data :" + data);
					threadData.put(Thread.currentThread(), data);
					new A().get();
					new B().get();
				}
			}).start();
		}
	}

	static class A {
		public void get() {
			int data = threadData.get(Thread.currentThread());
			System.out.println("A from " + Thread.currentThread().getName()
					+ " get data :" + data);
		}
	}

	static class B {
		public void get() {
			int data = threadData.get(Thread.currentThread());
			System.out.println("B from " + Thread.currentThread().getName()
					+ " get data :" + data);
		}
	}
}



输出结果:
Thread-0 has put data :806274789
Thread-1 has put data :1710804129
A from Thread-0 get data :806274789
A from Thread-1 get data :1710804129
B from Thread-0 get data :806274789
B from Thread-1 get data :1710804129


下面使用了ThreadLocal类,这个由API提供的类解决了共享变量的思路,其输出结果也如上。

public class ThreadLocalTest {

	private static ThreadLocal<Integer> x = new ThreadLocal<Integer>();
	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();
							System.out.println(Thread.currentThread().getName()
									+ " has put data: " + data);
							x.set(data);
							new A().get();
							new B().get();
						}
						
					}
			).start();
		}
		
	}
	
	static class A{
		public void get(){
			int data = x.get();
			System.out.println("A from" + Thread.currentThread().getName()
					+ " get data: " + data );
		}
	}
	
	static class B{
		public void get(){
			int data = x.get();
			System.out.println("B from" + Thread.currentThread().getName()
					+ " get data: " + data );
		}
	}

}


这个需要学习里边的思想


package cn.itcast.heima2;

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

//	往线程池x里边存入一个整形数据,然后由其他的线程池对象共享使用
//	新的线程存新的数据吗,由其他线程池对象共享使用
//	线程池对象的类的设计,单例的设计,拿到实例,set,拿到实例,get
public class ThreadLocalTest {

	private static ThreadLocal<Integer> x = new ThreadLocal<Integer>();
	private static ThreadLocal<MyThreadScopeData> myThreadScopeData = 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 = new Random().nextInt();
					System.out.println(Thread.currentThread().getName() 
							+ " has put data :" + data);
					x.set(data);
/*					MyThreadScopeData myData = new MyThreadScopeData();
					myData.setName("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 = x.get();
			System.out.println("A from " + Thread.currentThread().getName() 
					+ " get data :" + data);
/*			MyThreadScopeData myData = myThreadScopeData.get();;
			System.out.println("A from " + Thread.currentThread().getName() 
					+ " getMyData: " + myData.getName() + "," +
					myData.getAge());*/
			MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();
			System.out.println("A from " + Thread.currentThread().getName() 
					+ " getMyData: " + myData.getName() + "," +
					myData.getAge());
		}
	}
	
	static class B{
		public void get(){
			int data = 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(){
		MyThreadScopeData instance = map.get();
		if(instance == null){
			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;
	}
}



输出结果如下:
Thread-0 has put data :-1520297586
Thread-1 has put data :-1519143339
A from Thread-1 get data :-1519143339
A from Thread-0 get data :-1520297586
A from Thread-1 getMyData: name-1519143339,-1519143339
A from Thread-0 getMyData: name-1520297586,-1520297586
B from Thread-1 get data :-1519143339
B from Thread-0 get data :-1520297586
B from Thread-1 getMyData: name-1519143339,-1519143339
B from Thread-0 getMyData: name-1520297586,-1520297586

分享到:
评论

相关推荐

    Java多线程编程之ThreadLocal线程范围内的共享变量

    Java中的ThreadLocal是一种特殊类型的变量,它主要用于在多线程环境下提供线程范围内的局部变量。每个线程都拥有自己独立的ThreadLocal变量副本,互不影响。这与传统的全局变量不同,全局变量在所有线程间共享,可能...

    Solaris多线程编程指南

    ### Solaris多线程编程指南知识点汇总 #### 一、多线程基础介绍 - **定义多线程术语** - **线程**: 操作系统能够进行运算调度和分配的基本单位,是进程内的一个执行实体。 - **并发性**: 多个线程在同一时间段内...

    QT中sqlite多线程操作4个注意问题

    具体做法是在使用`QsqlQuery`变量时将其作用域限定在一个局部范围内,例如在一个代码块内使用 `{}` 花括号明确其生命周期。例如: ```cpp { QSqlQuery query(db); if (!query.exec("SELECT * FROM table")) { ...

    操作系统——线程

    操作系统中的线程是执行上下文的一个基本单位,它在进程的范围内运行,共享同一内存空间。线程模型的引入使得程序能实现并发执行,提高了系统的并行性和资源利用率。在这个主题中,我们将深入探讨线程的概念、类型、...

    Windows多线程编程详解

    TLS允许每个线程拥有自己的数据副本,即使这些数据在全局范围内声明。这对于需要在多个线程间区分状态的情况非常有用。 总结,Windows多线程编程涉及的内容广泛,从线程创建、同步、通信到线程管理,都需要开发者...

    张孝祥Java多线程与并发库高级应用笔记

    - **概念**:线程范围内共享变量是指在线程间共享的数据,需小心处理以避免竞态条件和数据不一致性。 - **作用**:允许线程间通信和协作,但需采用适当的同步机制(如`synchronized`关键字、`Lock`接口)以确保数据...

    linux多线程手册

    ### Linux多线程手册知识点详解 #### 一、多线程基础介绍 ##### 定义多线程术语 - **线程**:是进程中的一个执行单元,它共享进程的资源,但拥有独立的栈和寄存器上下文。 - **多线程**:指在一个进程中同时运行...

    linux多线程编程指南

    ### Linux多线程编程指南知识点总结 #### 一、多线程基础介绍 - **定义多线程术语:** - **线程(Thread)**:进程内的一个执行单元,是CPU调度的基本单位。 - **并发(Concurrency)**:多个任务同时进行的概念,但...

    多线程编程指南 pdf

    同步对象,如互斥锁、信号量、条件变量,用于解决多线程环境中的竞态条件和死锁问题。正确使用同步对象可以确保数据的一致性和线程的安全性。 **互斥锁**:是一种常用的同步机制,用于保护临界区,即一段不能被多个...

    易语言线程中的变量应用

    1. **全局变量**:全局变量在整个程序范围内可见,包括所有线程。当一个线程修改全局变量时,其他线程也可以立即看到这个变化。然而,由于多线程可能导致并发访问同一变量,因此需要考虑同步机制,如使用“锁定资源...

    Java多线程编程总结

    ### Java多线程编程总结 #### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个...

    iOS开发多线程编程指南

    ### iOS开发多线程编程指南 #### 简介与文档结构 本指南旨在帮助iOS开发者深入了解多线程编程的概念、原理以及最佳实践。多线程编程是提高应用程序响应性和性能的关键技术之一,在iOS开发中尤其重要。通过合理地...

    netty5多线程编程

    在分析Netty5多线程编程之前,首先需要了解Java内存模型与多线程编程的关系。硬件技术的进步,特别是多核处理器的发展和成本的降低,使得多任务处理成为操作系统的基本功能。多核处理器能够同时执行多个线程,使得...

    Java多线程与并发库高级应用视频教程22集

    Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程范围内共享...

    多线程编程指南

    在多线程编程中,线程是最小的可调度单元,它共享同一进程的资源,如内存空间,但拥有独立的栈和局部变量。 **定义多线程术语** - **线程**:程序中的执行流程,每个线程都有自己的程序计数器、寄存器集和堆栈。 -...

Global site tag (gtag.js) - Google Analytics