【悲观锁】Synchronized和ReentrantLock的区别
【线程方法】多线程下 wait、notify、park、unpark 和 await、signal 的区别
【同步工具】CyclicBarrier和CountDownLatch的区别
"线程八锁"通常是指在Java中使用synchronized
关键字时的八种不同的锁现象,也被称为"著名的八个锁"。这主要是通过对静态方法、非静态方法、静态变量和非静态变量的组合使用synchronized
关键字来产生不同的效果。以下是这八种锁的情况:
1、静态同步方法,锁的是当前类的Class对象:
public class MyClass {
public static synchronized void staticMethod() {
// ...
}
}
2、非静态同步方法,锁的是当前实例对象:
public class MyClass {
public synchronized void instanceMethod() {
// ...
}
}
3、静态同步方法和非静态同步方法分别锁的是不同的对象,不会互斥:
public class MyClass {
public static synchronized void staticMethod() {
// ...
}
public synchronized void instanceMethod() {
// ...
}
}
4、在静态同步方法中调用非静态同步方法,锁的是不同的对象,不会互斥:
public class MyClass {
public static synchronized void staticMethod() {
// ...
instanceMethod();
}
public synchronized void instanceMethod() {
// ...
}
}
5、在非静态同步方法中调用静态同步方法,锁的是不同的对象,不会互斥:
public class MyClass {
public synchronized void instanceMethod() {
// ...
staticMethod();
}
public static synchronized void staticMethod() {
// ...
}
}
6、两个实例对象调用非静态同步方法,锁的是各自实例对象,互不干扰:
public class MyClass {
public synchronized void instanceMethod() {
// ...
}
}
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();
7、两个实例对象调用同步代码块,锁的是各自实例对象,互不干扰:
public class MyClass {
public void instanceMethod() {
synchronized (this) {
// ...
}
}
}
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();
8、一个实例对象调用静态同步方法,另一个实例对象调用非静态同步方法,互不干扰:
public class MyClass {
public static synchronized void staticMethod() {
// ...
}
public synchronized void instanceMethod() {
// ...
}
}
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();
9、为同意一把锁
public class MyClass {
public synchronized void staticMethod() {
// ...
}
public synchronized void instanceMethod() {
// ...
}
}
MyClass obj = new MyClass();