package thread;
public class Test implements Runnable {
public Object 吃西餐先拿;
static Object 刀 = new Object();
static Object 叉 = new Object();
public static void main(String[] args) {
ChildClass c = new ChildClass();
c.f();
System.out.println("不会死锁,这种机制叫重进入!");
//--------重进入例子---------------
//---------死锁例子---------------
Test 丈夫 = new Test();
Test 妻子 = new Test();
丈夫.吃西餐先拿 = 刀;
妻子.吃西餐先拿 = 叉;
Thread t1 = new Thread(丈夫);
Thread t2 = new Thread(妻子);
t1.start();
t2.start();
}
public void run() {
if (吃西餐先拿 == 刀) {
synchronized (刀) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
synchronized (叉) {
System.out.println("1");
}
}
}
if (吃西餐先拿 == 叉) {
synchronized (叉) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
synchronized (刀) {
System.out.println("0");
}
}
}
}
}
class ParentClass extends Thread {
public synchronized void f() {
}
}
class ChildClass extends ParentClass {
public synchronized void f() {
super.f();
}
}
子类的重写同步方法f中又调用了父类的同步f方法 这时不会对调用的该对象死锁,可以理解为不会上第二个锁 也可以理解为第二把锁没有加上去。总而言之 sychronized关键字的本质是不让其他线程在同一对象上再上一把锁。