java 之 线程间变量共享

原创 2012年03月21日 13:03:13
import java.util.Random;

public class StaticTest {
	
	private static int data = 0;

	public static void main(String[] args) {
		//开三个线程
				for(int i=0;i<3;i++) {
					new Thread(new Runnable() {

						@Override
						public void run() {
							//每个线程data值都一样,下边的程序有解释
						 data = new Random().nextInt();
							System.out.println(Thread.currentThread().getName() + " has put data :"+ data);
						}
						
					}).start();
				}
	}

}

运行结果:

Thread-1 has put data :367396051
Thread-2 has put data :367396051
Thread-0 has put data :367396051

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


public class ThreadScopeShareData {

	//静态,会造成一样的随机值,此处有点不理解
	private static int data = 0;
	//以线程作为key
	private static Map<Thread,Integer> threadData = new HashMap<Thread, Integer>();
	
	public static void main(String[] args) {
		//开三个线程
		for(int i=0;i<3;i++) {
			new Thread(new Runnable() {

				@Override
				public void run() {
					//每个线程data值都一样,因为是静态变量,一改全改,最后的结果跟最后的线程data值一样
					//被后来的线程data值覆盖了,因为静态变量只有一份
//					data = new Random().nextInt();
					//这样就不同了
					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);
		}
	}
}


map模拟了ThreadLocal。

运行结果:

Thread-0 has put data :1500573848
Thread-2 has put data :1307429900
Thread-1 has put data :-1173968999
A from  Thread-1 get data : -1173968999
A from  Thread-0 get data : 1500573848
A from  Thread-2 get data : 1307429900
B from  Thread-1 get data : -1173968999
B from  Thread-0 get data : 1500573848
B from  Thread-2 get data : 1307429900


JAVA 并发编程-多个线程之间共享数据(六)

多线程共享数据的方式: 1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。2,如果每个线程执行的代码不同,这时候...
  • hejingyuan6
  • hejingyuan6
  • 2015年07月25日 10:09
  • 15288

JAVA 并发编程-线程范围内共享变量(五)

线程范围内共享变量要实现的效果为: 多个对象间共享同一线程内的变量未实现线程共享变量的demo:package cn.itcast.heima2; import java.util.HashMap;...
  • hejingyuan6
  • hejingyuan6
  • 2015年07月23日 15:43
  • 5469

java多线程的共享变量访问控制实例

最近打算去一家电商公司,对于高并发的数据访问控制有着严格的要求,近期打算把多线程的知识在好好补一下。 线程调度有五个状态; 开始,可运行,运行,阻塞,死亡。 启动线程有两种方法。继承Thread...
  • micro_hz
  • micro_hz
  • 2015年09月11日 15:44
  • 3563

java什么时候需要多线程 共享 变量

我们可以在计算机上运行各种计算机软件程序。每一个运行的程序可能包括多个独立运行的线程(Thread)。 线程(Thread)是一份独立运行的程序,有自己专用的运行栈。线程有可能和其他线程共享一些资源...
  • zhousenshan
  • zhousenshan
  • 2016年02月27日 17:27
  • 1055

JAVA多线程-对象及变量的并发访问(二)volatile关键字

三、Volatile关键字     关键字volatile的主要作用是使变量在多个线程间可见。 3.1 关键字volatile与死循环 测试案例: 我想通过改变flag的值,从而停止对servi...
  • qq_26504875
  • qq_26504875
  • 2016年02月20日 10:51
  • 899

java并发编程(对于线程内共享变量安全的思考)

上一篇博客讲解了,多个线程之间的互斥和同步的操作,一个是利用了锁的技术;另一个内则是利用了Object的notify和wait来实现同步操作。这篇博客呢,来谈一下对于线程内变量的安全问题。   经典的...
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2015年09月02日 20:00
  • 1695

Java 多线程 变量共享

1.方法体内部定义的局部变量不共享 2.成员变量共享 详情:http://www.cnblogs.com/xudong-bupt/archive/2013/05/22/3087864.ht...
  • yutian1204
  • yutian1204
  • 2015年02月04日 12:45
  • 245

java多线程之线程范围内共享变量的概念与作用

要实现线程范围内的数据共享,就是说不管是A模块还是B模块,如果它们现在在同一个线程上运行,它们操作的数据应该是同一个,下面的做法就不行: package javaplay.thread.test; ...
  • John8169
  • John8169
  • 2016年11月18日 20:21
  • 689

【Java多线程与并发库】5.线程范围内共享变量的概念与作用

我们可以使用ThreadLocal实现线程范围的共享变量。 ThreadLocal的作用和目的,用于实现线程内的数据共享,即对于相同的程序代码,多个模块在 同一个线程中运行时要共享一份数据,而在另外...
  • u013517797
  • u013517797
  • 2016年10月11日 12:58
  • 1330

Java高并发编程:线程范围内共享数据

笔记摘要所谓线程范围内共享数据,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据,API中为我们提供了一个操作线程范围内共享数据的类Thread...
  • axi295309066
  • axi295309066
  • 2016年10月24日 20:32
  • 1449
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 之 线程间变量共享
举报原因:
原因补充:

(最多只允许输入30个字)