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


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

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

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

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

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

线程间的互斥量和条件变量

互斥锁: PS:互斥锁的生存周期必须大于用到互斥锁的线程的生存周期! 静态分配互斥量: pthread_mutex_t  mutex=PTHREAD_MUTEX_INITIALIZER; 动态...

[C++11 并发编程] 12 使用条件变量创建线程间安全的队列

之前有一节中,我们使用mutex实现了一个线程间安全的堆栈。这一节,我们使用条件变量来实现一个线程间安全的队列。 标准库中的std::queue template > class queue { p...

线程间同步机制----条件变量

一、条件变量基本原理 条件变量是线程可用的另一种同步机制。条件变量给多个线程提供了一个 二、条件变量基本操作 三、条件变量应用实例

Java:使用wait()与notify()实现线程间协作

转自于:http://zhangjunhd.blog.51cto.com/113473/71387 使用wait()与notify()/notifyAll()可以使得多个任务之间彼此协作。 1...

java多线程3(线程间的通信)

1.线程通信方法 ①同步 线程B需要等待线程A执行完了methodA()方法之后,它才能执行methodB()方法。这样,线程A和线程B就实现了 通信。 这种方式,本质上就是“共享内存”式的通信...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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