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,如果每个线程执行的代码不同,这时候...

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

线程范围内共享变量要实现的效果为: 多个对象间共享同一线程内的变量未实现线程共享变量的demo:package cn.itcast.heima2; import java.util.HashMap;...

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

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

[Python]多线程编程&线程间共享变量&消费者生产者问题的解决

由于单进程爬虫的种种弊端,以及大量获取数据的需要,我最近开始写分布式爬虫。尽管网上已经有比较现成的方案,如scrapy+rq等,但是出于种种原因考虑,比如部署的难易程度,任务比较单一,以及想自己练练手...

多线程 : ThreadLocal 实现线程间共享变量隔离例子

package thread; import java.util.Random; public class ThreadLocalShareDataDemo { /** * ThreadL...

Java多线程/并发05、synchronized应用实例:线程间操作共享数据

电商平台中最重要的一点就是卖东西。同个商品不能无限制的卖下去的,因为商品有库存量,超过库存就不能卖了。 这里,约定一个规则,下单使库存减n,取消订单使库存加m。库存数量不可以小于0。 假设平台上同...
  • soonfly
  • soonfly
  • 2017年04月28日 16:03
  • 471

java线程访问ThreadLocal——线程间共享冲突

java线程访问ThreadLocal——线程间共享冲突 java5.0起,就有ThreadLocal支持了,ThreadLocal主要作用是线程间进行共享访问的时候创建一个副本,这样每个线程大家进...

Java的多线程-线程间的通信.doc

  • 2010年10月11日 23:06
  • 26KB
  • 下载

利用条件变量实现线程间同步

作者:曾宏安,华清远见嵌入式学院讲师。 我们在编写多线程程序时经常需要在线程之间实现通信,常见的机制有信号量和互斥锁。这里再向大家介绍一种用于实现线程间同步的机制——条件变量。 条件变量可以使线程...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 之 线程间变量共享
举报原因:
原因补充:

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