对象锁和类锁
加锁非静态方法,即是对象锁。synchronized修饰非静态方法、同步代码块的synchronized (this)用法和synchronized (非this对象)的用法锁的是对象,线程想要执行对应同步代码,需要获得对象锁。
加锁静态方法,即类锁。可以换个方向理解,静态方法其实就是类方法,所以加锁静态方法,即类锁。类锁的范围是整个实体类,即全局锁。
java的对象锁和类锁:java的对象锁和类锁在锁的概念上基本上和内置锁是一致的,但是,两个锁实际是有很大的区别的,对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的class对象上的。我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。但是有一点必须注意的是,其实类锁只是一个概念上的东西,并不是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的。
以下是对象锁的一段死锁代码:
package com.sansux.deadLock;
public class Test {
private static final Object obj1 = new Object();
private static final Object obj2 = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(new Thread1());
Thread t2 = new Thread(new Thread2());
t1.start();
t2.start();
}
static class Thread1 implements Runnable{
@Override
public void run() {
synchronized (obj1){
System.out.println(Thread.currentThread().getName() +"获得对象锁obj1");
try {
Thread.sleep(3000);
synchronized (obj2){
System.out.println(Thread.currentThread().getName() +"获得对象锁obj2");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class Thread2 implements Runnable{
@Override
public void run() {
synchronized (obj2){
System.out.println(Thread.currentThread().getName() +"获得对象锁obj2");
try {
Thread.sleep(3000);
synchronized (obj1){
System.out.println(Thread.currentThread().getName() +"获得对象锁obj1");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
输入结果: