package ConcurrentSource;/*
@author 黄大宁Rhinos
@date 2019/5/7 - 16:57
**/
public class Test03 {
public static void main(String[] args) {
new Thread(new Father()).start();
new Thread(new Son()).start();
}
}
class Father implements Runnable{
public void testCode(){
synchronized (Father.class){
System.out.println("执行父类方法中...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
testCode();
}
}
class Son extends Father implements Runnable{
public void testCode2(){
synchronized (Father.class){
System.out.println("执行子类方法中...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
testCode2();
}
}
代码运行结果:
执行父类方法中…
(2s后)
执行子类方法中…
如果父子锁得都是Father.class或这都是Son.class,那么必然两者是存在竞争关系的。
如果父亲锁Father.cass,儿子锁Son.class,这两个对象是不一致的,因此不会存在竞争关系。即以下代码会同时输出:
package ConcurrentSource;/*
@author 黄大宁Rhinos
@date 2019/5/7 - 16:57
**/
public class Test03 {
public static void main(String[] args) {
new Thread(new Father()).start();
new Thread(new Son()).start();
}
}
class Father implements Runnable{
public void testCode(){
synchronized (Father.class){
System.out.println("执行父类方法中...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
testCode();
}
}
class Son extends Father implements Runnable{
public void testCode2(){
synchronized (Son.class){
System.out.println("执行子类方法中...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
testCode2();
}
}
代码运行结果:
执行父类方法中…
执行子类方法中…