Synchronized关键字

参考:多线程知识梳理- 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关键字的情况

你可能感兴趣的:(Synchronized关键字)