在java中,死锁可以很容易用如下代码来模拟
package jdk8;
public class Deadlock {
public static void main (String args[]){
final Object objA = new Object();
final Object objB = new Object();
new Thread() {
public void run (){
while (1==1) {
System.out.println ("Thread A synchronizing on objA");
synchronized (objA){
System.out.println ("Thread A synchronized on objA");
System.out.println ("Thread A synchronizing on objB");
synchronized (objB){
System.out.println ("Thread A synchronized on objB");
}
}
}
}
}.start();
new Thread() {
public void run (){
while (1==1) {
System.out.println ("Thread B synchronizing on objB");
synchronized (objB){
System.out.println ("Thread B synchronized on objB");
System.out.println ("Thread B synchronizing on objA");
synchronized (objA){
System.out.println ("Thread B synchronized on objA");
}
}
}
}
}.start();
}
}
另外java中的synchronized关键字和ReentrantLock都是实现了可重入锁的机制,如下
public synchronized void functionOne() {
// do something
functionTwo();
synchronized(this) {
// do more stuff
}
}
public synchronized void functionTwo() {
// do even more stuff!
}
如果synchronized没有可重入锁的机制的话,当某线程访问了functionOne的时候,此线程已经得到了当前对象的monitor,如果没有可以重入锁的机制,这个时候他去访问functionTwo又会尝试获取当前对象的monitor,结果就会是死锁