java多线程,静态方法加锁后,调用该方法会影响其它方法吗?( 二 )


Thread.sleep(3000);
System.out.println(Thread.currentThread().getName() + " : 加Class对象锁的静态方法运行结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void syncClassYes() {
synchronized (SyncStaticYesAndNo.class) {
try {
System.out.println(Thread.currentThread().getName() + " : 加Class对象锁的非静态方法运行开始n");
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName() + " : 加Class对象锁的非静态方法运行结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
if (Thread.currentThread().getName().equals("Thread-0")) {
syncStaticYes1();
} else if (Thread.currentThread().getName().equals("Thread-1")) {
syncStaticYes2();
} else if (Thread.currentThread().getName().equals("Thread-2")) {
syncStaticNo();
} else if (Thread.currentThread().getName().equals("Thread-3")) {
syncYes();
} else if (Thread.currentThread().getName().equals("Thread-4")) {
syncNo();
} else if (Thread.currentThread().getName().equals("Thread-5")) {
syncStaticClassYes();
} else if (Thread.currentThread().getName().equals("Thread-6")) {
syncClassYes();
}
}
public static void main(String[] args) {
SyncStaticYesAndNo obj = new SyncStaticYesAndNo();
Thread t1 = new Thread(obj);
Thread t2 = new Thread(obj);
Thread t3 = new Thread(obj);
Thread t4 = new Thread(obj);
Thread t5 = new Thread(obj);
Thread t6= new Thread(obj);
Thread t7 = new Thread(obj);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
t7.start();
}
}
这里,我们使用了七个线程来模拟多个情况,然后几乎同时调用七个方法,由之前的分析,我们可以推测,只有竞争统一把锁,才会产生阻塞情况,所以结果如下:
Thread-1 : 加锁的静态方法运行开始
Thread-3 : 加锁的非静态方法运行开始
Thread-2 : 不加锁的静态方法运行开始
Thread-4 : 不加锁的非静态方法运行开始
Thread-3 : 加锁的非静态方法运行结束
Thread-1 : 加锁的静态方法运行结束
Thread-2 : 不加锁的静态方法运行结束
Thread-6 : 加Class对象锁的非静态方法运行开始
Thread-4 : 不加锁的非静态方法运行结束
Thread-6 : 加Class对象锁的非静态方法运行结束
Thread-5 : 加Class对象锁的静态方法运行开始
Thread-5 : 加Class对象锁的静态方法运行结束
Thread-0 : 加锁的静态方法运行开始
Thread-0 : 加锁的静态方法运行结束
结论我们可以看到,不加锁的没有受到任何影响,而加了锁的非静态方法也没有受到任何影响,因为它所竞争的锁并非是Class对象锁,而是实例对象锁,受到影响的有synchronized修饰的静态方法,还有便是加了Class对象锁的方法,本质上便是它们都在竞争当前类的Class对象锁 。
    



推荐阅读