学习之Javajava学习

Java并发 --- synchronized 关键字

2021-06-21  本文已影响0人  _code_x

synchronized概述

Synchronized是Java中解决并发问题的一种最常用的方法(还有Lock也是常用方法),也是最简单的一种方法。

Synchronized的作用主要有三个(并发编程需要满足的三个特性):

从语法上讲,Synchronized可以把任何一个非null对象作为"锁",在HotSpot JVM实现中,锁有个专门的名字:对象监视器(Object Monitor)

synchronized作为java中的锁机制,解决的就是多线程访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行,在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。

Synchronized总共有三种用法:

同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法。

synchronized底层实现

jvm基于进入和退出Monitor对象来实现方法同步和代码块同步。

总之,对于同步方法,反编译后得到ACC_SYNCHRONIZED 标志,对于同步代码块反编译后得到monitorenter和monitorexit指令。

synchronized 性质:可重入性与不可中断性

synchronized优化

(1)锁升级

synchronized的概述

获取锁和释放锁要经过操作系统:

说说JDK1.6后的synchronized关键字底层做了哪些优化?

解释一下优化后的三种锁和升级过程:

Mark Word的存储结构

锁的优缺点对比

(2)锁粗化

锁粗化是发生在编译器级别(JVM对锁的优化)的一种锁优化方式。

(3)锁消除

锁消除也是发生在编译器级别的一种锁优化方式。

补充

synchronized与Lock区别,为什么还要提供Lock?

Synchronized编码更简单,锁机制由JVM维护,在竞争不激烈的情况下性能更好。Lock功能更强大更灵活,竞争激烈时性能较好。

拓展:Lock支持的功能:

锁的实现在本质上都对应着一个入口等待队列, 如果一个线程没有获得锁, 就会进入等待队列, 当有线程释放锁的时候, 就需要从等待队列中唤醒一个等待的线程。

最后,值得注意的是,在使用Lock加锁时,一定要在finally{}代码块中释放锁,例如,下面的代码片段所示。

try{
    lock.lock();
}finally{
    lock.unlock();
}

synchronized存在什么问题呢?

如何进行设计呢?

Lock常用方法:

介绍一下自旋锁

自旋锁存在的问题

自旋锁的优点

以上仅供学习使用!

巨人的肩膀

https://blog.csdn.net/weixin_38481963/article/details/88384493
https://blog.csdn.net/tongdanping/article/details/79647337
https://www.jianshu.com/p/11e292d82e5d
https://blog.csdn.net/Dennis_Wu_/article/details/89576042
https://blog.csdn.net/qq_40771292/article/details/108663846

上一篇 下一篇

猜你喜欢

热点阅读