1.synchronized的使用
synchronized 同步块是 Java 提供的一种原子性内置锁,Java 中的每个对象都可以把它当作一个同步锁来使用,这些 Java 内置的使用者看不到的锁被称为内置锁,也叫作监视器锁。
2.synchronized加锁方式区别
3.synchronized底层原理
synchronized是JVM内置锁,基于Monitor机制实现,依赖底层操作系统的互斥原语Mutex(互斥量),它是一个重量级锁,性能较低。当然,JVM内置锁在1.5之后版本做了重大的优化,如锁粗化、锁消除、轻量级锁、偏向锁、自适应自旋等技术来减少锁操作的开销,内置锁的并发性能已经基本与Lock持平。
1.Java虚拟机通过一个同步结构支持方法和方法中的指令序列的同步:monitor。
1.1同步方法是通过方法中的access_flags中设置ACC_SYNCHRONIZED标志来实现
1.2同步代码块是通过monitorenter和monitorexit来实现。
两个指令的执行是JVM通过调用操作系统的互斥原语mutex来实现,被阻塞的线程会被挂起、等待重新调度,会导致“用户态和内核态”两个态之间来回切换,对性能有较大影响。
3.1monitor解释
monitor叫法很多,管程,监视器都可以。
对操作系统领域来说,monotor是指管理共享变量以及对共享变量操作的过程,让它们支持并发
管程是一种实现,那必然就有他的设计模型。分别是Hasen模型、Hoare模型和MESA模型。现在正在广泛使用的是MESA模型。这里偷个懒,网上找了个图。
3.2Monitor在java中的实现
java.lang.Object 类定义了 wait(),notify(),notifyAll() 方法,这些方法的具体实现,依赖于 ObjectMonitor 实现。这里借鉴别人博客,
https://blog.csdn.net/zwjyyy1203/article/details/106217887。感谢博主分享
//结构体如下
ObjectMonitor::ObjectMonitor() {
_header = NULL;
_count = 0;
_waiters = 0,
_recursions = 0; //线程的重入次数
_object = NULL;
_owner = NULL; //标识拥有该monitor的线程
_WaitSet = NULL; //等待线程组成的双向循环链表,_WaitSet是第一个节点
_WaitSetLock = 0 ;
_Responsible = NULL ;
_succ = NULL ;
_cxq = NULL ; //多线程竞争锁进入时的单向链表
FreeNext = NULL ;
_EntryList = NULL ; //_owner从该双向循环链表中唤���线程结点,_EntryList是第一个节点
_SpinFreq = 0 ;
_SpinClock = 0 ;
OwnerIsThread = 0 ;
}
每秒