参考:多线程知识梳理- synchronized 三部曲之基本使用
一、八种场景,四种背景
1.Class对象:
- 静态方法
- 静态方法代码块1 -
SynchronizedObject.class
- 普通方法代码块1 -
SynchronizedObject.class
//静态方法,使用的是Class类锁
synchronized public static void staticMethod() {}
//静态方法代码块1,使用的是Class类锁
public static void staticBlock1() {
synchronized (SynchronizedObject.class) {}
}
//普通方法代码块1,使用的是Class类锁
public void block1() {
synchronized (SynchronizedObject.class) {}
}
2.调用方法的对象
- 普通方法
- 普通方法代码块4 -
this
//普通方法,使用的是调用该方法的对象锁
synchronized public void method() {}
//普通方法代码块4,使用的是调用该方法的对象锁
public void block4() {
synchronized (this) {}
}
3.静态对象
- 静态方法代码块2 -
mStaticLockByte
- 普通方法代码块3 -
mStaticLockByte
private static final byte[] mStaticLockByte = new byte[1];
//静态方法代码块2,使用的是内部静态变量锁
public static void staticBlock2() {
synchronized (mStaticLockByte) {}
}
//普通方法代码块3,使用的是mStaticLockByte的变量锁
public void block3() {
synchronized (mStaticLockByte) {}
}
4.非静态对象
- 普通方法代码块1 -
mLockByte
private final byte[] mLockByte = new byte[1];
//普通方法代码块2,使用的是mLockByte的变量锁
public void block2() {
synchronized (mLockByte) {} //变量需要声明为final
}
如果使用场景属于上面的同一个分类当中,那么才有可能产生线程阻塞在synchronized
关键字的情况