Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:
- 普通同步方法,锁是当前实例对象
- 静态同步方法,锁是当前类的class对象
- 同步方法块,锁是括号里面的对象
Moniter
为了解决线程安全的问题,Java提供了同步机制、互斥锁机制,这个机制保证了在同一时刻只有一个线程能访问共享资源。这个机制的保障来源于监视锁Monitor。
每一个Object对象中内置了一个Monitor对象。(对象头的MarkWord中的LockWord指向monitor的起始地址)
public class Test {
public static void main(String[] args) {
Object lock = new Object();
synchronized (lock) {
System.out.println("hello world.");
}
}
}
利用javap工具查看生成的class文件信息来分析Synchronize的实现
Compiled from "Test.java"
public class sync.Test {
public sync.Test();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #3 // class java/lang/Object
3: dup
4: invokespecial #8 // Method java/lang/Object."<init>":()V
7: astore_1
8: aload_1
9: dup
10: astore_2
11: monitorenter
12: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
15: ldc #22 // String hello world.
17: invokevirtual #24 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
20: aload_2
21: monitorexit
22: goto 28
25: aload_2
26: monitorexit
27: athrow
28: return
Exception table:
from to target type
12 22 25 any
25 27 25 any
}