多线程_01_Synchronized关键字
1.Synchronized的使用:
Synchronized关键字可以解决多线程中的可见性、原子性以及顺序性。Synchronized有三种方式加锁:
1)修饰静态方法,此时加锁对象为.class对象;
2)修饰实例方法,此时加锁对象为调用该方法的对象;
3)修饰代码块,此时加锁对象为程序员任意指定。
使用Synchronized进行同步使用到了monitorenter指令和monitorexit指令,这两个指令分别实现了lock和unlock。在Synchronized修饰的代码段开头,线程会执行monitorenter指令,尝试获取锁对象的监视器,这个过程是排他的,也就是说,锁对象的监视器只能被一个线程占用。在Synchronized修饰的代码段结尾,线程会执行monitorexit指令,释放锁对象的监视器。
2.Synchronized的底层原理:
2.1 为什么每个对象都可以成为锁?
因为每个java对象在JVM中都有一个与之对应的C++的oop对象,每一个oop对象里面都有一个成员markOop 对象头,该对象头里有ObjectMonitor对象。ObjectMonitor即对象监视器。该监视器有个重要的属性,即_owner,指向获得该对象监视器的线程。

浙公网安备 33010602011771号