05-线程范围内共享变量的概念与作用

本节演示不同线程操作同一个变量时,该变量的值可能会不同

1. 先演示相同的情况

package cn.itcast.demo.thread;

import java.util.Random;

public class ThreadScopeData {
	
	private static int data = 0;
	public static void main(String[] args) {
		new Thread(new Runnable() {
			@Override
			public void run() {
				data = new Random().nextInt();
				System.out.println(Thread.currentThread().getName() + " has put data: " + data);
				new A().get();
				new B().get();
			}
		}).start();
	}
	
	// A模块
	static class A {
		public void get() {
			System.out.println("A from " + Thread.currentThread().getName() + " get data: " + data);
		}
	}
	
	// B模块
	static class B {
		public void get() {
			System.out.println("B from " + Thread.currentThread().getName()+ " get data: " + data);
		}
	}
}

打印结果:

Thread-0 has put data: -572624867
A from Thread-0 get data: -572624867
B from Thread-0 get data: -572624867

不同的情况:

package cn.itcast.demo.thread;

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

public class ThreadScopeData {
	
	//private static int data = 0;
	private static Map<Thread, Integer> threadMap = 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();
						threadMap.put(Thread.currentThread(), data);
						System.out.println(Thread.currentThread().getName() + " has put data: " + data);
						
						new A().get();
						new B().get();
					}
			}).start();
		}
	}
	
	// A模块
	static class A {
		public void get() {
			int data = threadMap.get(Thread.currentThread());
			System.out.println("A from " + Thread.currentThread().getName() + " get data: " + data);
		}
	}
	
	// B模块
	static class B {
		public void get() {
			int data = threadMap.get(Thread.currentThread());
			System.out.println("B from " + Thread.currentThread().getName()+ " get data: " + data);
		}
	}
}

打印结果:

Thread-1 has put data: -1284132079
Thread-0 has put data: -1386630400
A from Thread-0 get data: -1386630400
A from Thread-1 get data: -1284132079
B from Thread-1 get data: -1284132079
B from Thread-0 get data: -1386630400

 

 

posted @ 2017-08-16 19:14  半生戎马,共话桑麻、  阅读(124)  评论(0)    收藏  举报
levels of contents