在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,结果就会是死锁