synchronized
2021-06-30 09:49:26 8 举报
关于synchronized。 后续还有补充。
作者其他创作
大纲/内容
JOL:Java Object Layout查看Java对象内存布局
synchronized 同步语句块
synchronized 和 ReentrantLock 的区别
synchronized(obj) { System.out.println(ClassLayout.parseInstance(obj).toPrintable());}
Object obj = new Object();System.out.println(ClassLayout.parseInstance(obj).toPrintable());
synchronized 修饰的方法并没有 monitorenter 指令和 monitorexit 指令,取得代之的确实是 ACC_SYNCHRONIZED 标识。该标识指明了该方法是一个同步方法,JVM 通过该 ACC_SYNCHRONIZED 访问标志来辨别一个方法是否声明为同步方法,从而执行相应的同步调用。
锁信息记录在markword里面
synchronized 锁升级过程
synchronized 是和 if、else、for、while 一样的关键字,ReentrantLock 是类,这是二者的本质区别。既然 ReentrantLock 是类,那么它就提供了比 synchronized 更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量。ReentrantLock 比 synchronized 的扩展性体现在几点上:1、ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁2、ReentrantLock可以获取各种锁的信息3、ReentrantLock可以灵活地实现多路通知另外,二者的锁机制其实也是不一样的。ReentrantLock 底层调用的是 Unsafe 的 park 方法加锁, synchronized 操作的应该是对象头中 mark word(这点我不能确定)。
synchronized 同步语句块的实现使用的是 monitorenter 和 monitorexit 指令。当执行 monitorenter 指令时,线城市图获取锁也就是获取 monitor(monitor 对象存在于每个 Java 对象的对象头中,synchronized 锁便是通过这种方式获取锁的,也是为什么 Java 中任意对象可以作为锁的原因)的持有权。当计数器为 0 则可以成功获取,获取后将锁计数器设为 1,也就是加 1。相应的,在执行 monitorexit 指令后,将锁计数器设为 0,表明锁被释放。如果获取对象锁失败, 那当前线程就要阻塞等待,直到锁被另一个线程释放为止。
synchronized 关键字底层原理属于 JVM 层面
synchronized 修饰方法
0 条评论
下一页