为了探索同步的特性做了些实验:
package com.wjy.synchronize; public class MyThread implements Runnable{ @Override public void run() { // TODO Auto-generated method stub synchronized (this) { for(int i=0;i<10;i++){ try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" loop "+i); } } } }
我们知道将synchronized的标识移动到函数声明的地方也是一样的效果,即public synchronized void run(){....。
但是:有没有想过将synchronized(this)中的this换成MyThread.class呢?就是synchronized(MyThread.class) 。
实验结果:看起来是一样的,其实不然。
测试代码:
package com.wjy.test; import com.wjy.synchronize.MyThread; public class MainTestSyn { public static void main(String args[]){ final MyThread myThread=new MyThread(); Thread thread1=new Thread(myThread, "buDog"); Thread thread2=new Thread(myThread, "paoDog");
thread1.start(); thread2.start(); } }
但是若是将测试代码修改为:
package com.wjy.test; import com.wjy.synchronize.MyThread; public class MainTestSyn { public static void main(String args[]){ final MyThread myThread=new MyThread(); final MyThread addThread=new MyThread(); Thread thread1=new Thread(myThread, "buDog"); Thread thread2=new Thread(addThread, "paoDog"); thread1.start(); thread2.start(); } }
就会发现this和MyThread.class的不同。因为若采用以上测试代码的话,this是达不到同步效果的。所以MyThread.class的意思是对所有的MyThread的对象同步。而this仅仅是对当前对象同步。