java线程同步细节

在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是不同的内存单元

猜你喜欢

转载自smllys.iteye.com/blog/1648684