1.synchronized在字节码层面的实现方式
代码:
package multiThreads;
public class Test17 {
Object object = new Object();
public void m1() {
synchronized (object) {
System.out.println("--hello synchronized code block ");
}
}
public static void main(String[] args) {
}
}
字节码:
通常情况下,synchronized代码块是一个monitorenter和两个monitorexit实现的。
2.synchronized修饰的方法会有 ACC_SYNCHRONIZED修饰
代码:
package multiThreads;
public class Test17 {
Object object = new Object();
public void m1() {
synchronized (object) {
System.out.println("--hello synchronized code block ");
}
}
public synchronized void m2 () {
System.out.println("--hello synchronized method");
}
public static void main(String[] args) {
}
}
字节码:
解释:调用指令将会检查方法的ACC_SYNCHRONIZED的访问标志是否被设置。如果设置了,执行线程将会先持有monitor锁,然后执行方法,最后释放monitor锁(无论是方法正常执行完还是发生异常)。
面试题:为什么任何对象都可以成为锁?
管程(英文:Monitors,即监视器)是一种程序结构,结构内的多个子程序(对象或模块)形成的多个工作线程互斥的访问共享资源。这些共享资源一般是硬件设备或者一群变量,对共享变量能够进行的所有操作集中在一个模块中。(把信号量及其操作原语“封装”在一个对象内部)管程实现了在一个时间点,最多只有一个线程在执行管程的某个子程序。管程提供了一种机制,管程可以看做一个软件模块,它是将共享的变量和对于这些共享变量的操作封装起来,形成一个具有一定接口的功能模块,进程可以调用管程来实现进程级别的并发控制。
Java 的管程是靠ObjectMonitor来实现,ObjectMonitor.java -> ObjectMonitor.cpp -> ObjectMonitor.hpp