在java线程同步中,被多线程共享的对象该对象的函数和属性都会共享,但是函数里面的局部变量是不同的,他们被分别存储在所属线程的数据空间里面。从内存角度来分析,共享对象的函数和属性,在不同的线程中,都是同一个内存单元,而函数中的局部变量,在线程执行的时候才会产生,每个线程都在所属的内存空间里申请一个内存单元。
public class MyThread extends Thread{
private SingleTon singleTon;
public void set(SingleTon singleTon){
this.singleTon = singleTon;
}
public void run(){
try {
singleTon.test();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args){
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();
thread1.set(SingleTon.getInstance());
thread2.set(SingleTon.getInstance());
thread1.setName("thread1");
thread2.setName("thread2");
thread1.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
thread2.start();
}
}
public class SingleTon {
private static SingleTon singleTon=new SingleTon();
private static SingleTon classMember =singleTon;
public static SingleTon getInstance(){
if(singleTon == null)
singleTon = new SingleTon();
return singleTon;
}
public void test() throws InterruptedException{
SingleTon localMember =new SingleTon();
System.out.println(Thread.currentThread().getName()+" classMember = "+classMember);
System.out.println(Thread.currentThread().getName()+" localMember = "+localMember);
}
}
打印结果:
thread1 classMember = SingleTon@1fb8ee3
thread1 localMember = SingleTon@61de33
thread2 classMember = SingleTon@1fb8ee3
thread2 localMember = SingleTon@10b30a7
可以看到thread1,thread2中的classMember是一个内存单元,而localMember是不同的内存单元