java产生死锁的条件:
- 双方都各自握有一把锁;
- 双方都没有释放持有的锁,同时又获取对方持有的锁;
synchronized产生的死锁:
package com;
import java.util.Date;
public class DeadLockTest {
public static String lock1 = "lock1";
public static String lock2 = "lock2";
public static void main(String[] args) {
Thread t1 = new Thread(new ThreadA());
Thread t2 = new Thread(new ThreadB());
t1.start();
t2.start();
}
}
class ThreadA implements Runnable{
@Override
public void run() {
while(true){
System.out.println("线程A执行开始"+new Date().toString());
synchronized (DeadLockTest.lock1){
System.out.println("线程A获取lock1");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (DeadLockTest.lock2){
System.out.println("线程A获取lock2");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println("线程A执行结束"+new Date().toString());
}
}
}
class ThreadB implements Runnable{
@Override
public void run() {
while(true){
System.out.println("线程B执行开始"+new Date().toString());
synchronized (DeadLockTest.lock2){
System.out.println("线程B获取lock2");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (DeadLockTest.lock1){
System.out.println("线程B获取lock1");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println("线程B执行结束"+new Date().toString());
}
}
}
使用console检测死锁:
ReentrantLock产生死锁的例子:
package com;
import java.util.concurrent.locks.ReentrantLock;
public class DeadReentrantLock {
public static ReentrantLock lock1 = new ReentrantLock();
public static ReentrantLock lock2 = new ReentrantLock();
public static void main(String[] args) {
Thread t1 = new Thread(new Runner1());
Thread t2 = new Thread(new Runner2());
t1.start();
t2.start();
}
}
class Runner1 implements Runnable{
@Override
public void run() {
while(true){
try {
DeadReentrantLock.lock1.lock();
System.out.println("runner 1 获取到锁1");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
DeadReentrantLock.lock2.lock();
System.out.println("runner 1 获取到锁2");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} finally {
DeadReentrantLock.lock2.unlock();
System.out.println("runnner 1 释放锁2");
}
} finally {
DeadReentrantLock.lock1.unlock();
System.out.println("runnner 1 释放锁1");
}
}
}
}
class Runner2 implements Runnable{
@Override
public void run() {
try {
DeadReentrantLock.lock2.lock();
System.out.println("runner 2 获取到锁2");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
DeadReentrantLock.lock1.lock();
System.out.println("runner 2 获取到锁1");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} finally {
DeadReentrantLock.lock1.unlock();
System.out.println("runnner 2 释放锁1");
}
} finally {
DeadReentrantLock.lock2.unlock();
System.out.println("runnner 2 释放锁2");
}
}
}
使用console检测死锁: