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