以前以为这两个锁是一个锁,最近测试了一下发现并不是这样:
代码如下
public class CusAndPro {
public synchronized void test1() throws InterruptedException {
while(true)
{
System.out.println(Thread.currentThread().getName()+"方法1");
TimeUnit.SECONDS.sleep(2);
}
}
public static synchronized void test2() {
while(true)
{
System.out.println(Thread.currentThread().getName()+"方法2");
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
CusAndPro vio=new CusAndPro();
Thread thread1=new Thread(new Runnable() {//线程1调用test1方法
public void run()
{
try {
vio.test1();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} );
Thread thread2=new Thread(new Runnable() {//线程2调用test1方法
public void run()
{
vio.test2();
}
} );
thread1.start();
thread2.start();
}
}
结果:
Thread-0方法1
Thread-1方法2
Thread-1方法2
Thread-0方法1
Thread-1方法2
Thread-0方法1
发现交替打印,test1是synchronized修饰的普通方法,锁住的是当前实例,test2是synchronized修饰的静态方法锁住的是
整个类,但是两个方法都能运行,说明,类锁和对象锁不是同一个锁,锁对象的时候,只有synchronized修饰的普通方法不能访问,锁类的时候,只有synchronized修饰的静态方法不能访问。