我写了这样一个测试程序:Runner是Runnable的实现类,类里面包含一个Object类型的私有变量,想通过这个程序测试看是否类的私有成员在多个线程中是否是共享的。
大多数的输出结果中没有重复的值,但是偶尔会出现相同的结果,不知道我的程序哪里出现问题了? 类的私有变量是不是多个线程共享的?
import java.util.ArrayList; import java.util.List; public class SharedVariableDemo { private static List<Thread> threadList = new ArrayList<Thread>(); public static void main(String[] args) { for (int i = 0; i < 10; i++) { threadList.add(new Thread(new Runner())); } for (int i = 0; i < 10; i++) { Thread t = threadList.get(i); t.start(); } } } class Runner implements Runnable { private Object obj = null; public Runner() { synchronized (this) { obj = new Object(); } } public void run() { synchronized (this) { System.out.println(obj.toString()); } } }
输出结果:
java.lang.Object@10b30a7
java.lang.Object@89ae9e
java.lang.Object@60aeb0
java.lang.Object@66848c
java.lang.Object@1d58aae
java.lang.Object@de6f34
java.lang.Object@10d448 // 偶尔会出现值相同的情况。
java.lang.Object@10d448 //
java.lang.Object@e0e1c6
java.lang.Object@6ca1c
问题补充:
那么线程类的私有变量需要做同步处理吗?
问题补充:
那么是不是说:每个线程实例都有一个属于自己的私有空间,私有变量都是保存在这个私有空间的?