1、重入锁
在非静态方法上使用synchronized同步,此时使用的锁为this对象内置锁,若在静态方法则锁表现为当前类的class文件内置锁。内置锁是一种可重入的锁。
public class SynchronizedDemo {
public synchronized void methodA(){
System.out.println("methodA方法被调用!");
methodB();//若此处锁不可重入则表现为死锁,实际methodB方法有被调用
}
public synchronized void methodB(){
System.out.println("methodB方法被调用了!");
}
public static void main(String[] args) {
SynchronizedDemo syn = new SynchronizedDemo();
syn.methodA();
}
}
2、死锁
public class DeadLockDemo {
Object lock1 = new Object();
Object lock2 = new Object();
public void methodA() {
synchronized (lock1) {
try {
Thread.sleep(500);//线程等待模拟死锁
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.err.println("methodA执行成功...");
}
}
}
public void methodB() {
synchronized (lock2) {
try {
Thread.sleep(500);//线程等待模拟死锁
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1) {
System.err.println("methodB执行成功...");
}
}
}
public static void main(String[] args) {
DeadLockDemo deadLock = new DeadLockDemo();
new Thread(new Runnable(){
@Override
public void run() {
deadLock.methodA();
}
}).start();
//主线程调用
deadLock.methodB();
}
}
使用jdk自带工具jconsole.exe检测死锁:thread1和main线程之间发生死锁