目录
1.功能
synchronized是用与线程同步,是一个重量级互斥锁,可以保证方法或者代码块在运行时,同一时刻只有一个线程可以进入到该对象的临界区(同一个对象的所有synchronized保卫的代码块)。
synchronized是可重入的,即同一个线程,可以多次进入同个对象的多个synchronized块。
2.锁对象
synchronized修饰位置 | 锁对象 | 样例 |
---|---|---|
实例方法 | 当前实例对象 this | public synchronized void synMethod() |
静态方法 | 当前类的Class对象 | public static synchronized void doSth() |
代码块 | 括号里面的对象, 既可以是实例对象 也可以是类对象 |
synchronized (lock) {...} synchronized (lock.getClass()) {...} |
3.JVM实现
下面看下一个同步块编译后的虚拟机指令是什么样的,
方法 | .class类文件指令 |
---|---|
|
public void synBlock(); descriptor: ()V flags: ACC_PUBLIC Code: stack=2, locals=3, args_size=1 0: aload_0 1: dup 2: astore_1 3: monitorenter 4: aload_0 5: getfield #2 // Field x:I 8: bipush 12 10: if_icmpge 19 13: aload_0 14: bipush 12 16: putfield #2 // Field x:I 19: aload_1 20: monitorexit 21: goto 29 24: astore_2 25: aload_1 26: monitorexit 27: aload_2 28: athrow 29: return Exception table:
|