关于锁的基础知识

1、synchronized作用于静态方法和非静态方法的区别
非静态方法:给对象加锁(可以理解为给这个对象的内存上锁,注意:只是这块内存,其他同类对象都会有各自的内存锁),这时候在其他一个以上线程中执行该对象的这个同步方法(注意:是该对象)就会产生互斥

静态方法: 相当于在类上加锁(*.class位于代码区,静态方法位于静态区域,这个类产生的对象公用这个静态方法,所以这块内存,N个对象来竞争),这时候,只要是这个类产生的对象,在调用这个静态方法时都会产生互斥。即该类所有的对象都共享一把锁。

2、当一个线程进一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?

不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁

3、线程同步的几种方式
(1)synchronized修饰
(2)volatile实现同步(只能保证可见性,不能保证原子性)
(3)使用局部变量ThreadLocal
(4)使用原子类(AtomicInteger、AtomicBoolean……)
(5)使用Lock(ReentrantLock)
(6)使用线程安全的容器类(ConcurrentHashMap、BlockingQueue)

4、synchronized和java.util.concurrent.locks.Lock的异同?

  • lock 必须在 finally 块中释放。否则,如果受保护的代码将抛出异常,锁就有可能永远得不到释放!这一点区别看起来可能没什么,但是实际上,它极为重要。忘记在 finally 块中释放锁,可能会在程序中留下一个定时炸弹,当有一天炸弹爆炸时,您要花费很大力气才有找到源头在哪。
  • 使用synchronized,JVM 将确保锁会获得自动释放(任务正常结束/异常退出)

一个 Lock 对象和一个 synchronized 代码块之间的主要不同点是:
synchronized代码块不能够保证进入访问等待的线程的先后顺序。 你不能够传递任何参数给一个 synchronized代码块的入口。因此,对于 synchronized 代码块的访问等待设置超时时间是不可能的事情。 synchronized块必须被完整地包含在单个方法里。而一个 Lock 对象可以把它的 lock() 和 unlock() 方法的调用放在不同的方法里。

5、乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

  • 乐观锁,每次操作时不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止
  • 悲观锁是会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。
  • 乐观锁可以使用volatile+CAS原语实现,带参数版本来避免ABA问题,在读取和替换的时候进行判定版本是否一致
  • 悲观锁可以使用synchronize的以及Lock

6、Synchronized有哪些缺点?

只有一个condition与锁相关联,这个condition是什么?就是synchronized对针对的对象锁。

  • synchronized无法中断一个正在等待获得锁的线程,也即多线程竞争一个锁时,其余未得到锁的线程只能不停的尝试获得锁,而不能中断。这种情况对于大量的竞争线程会造成性能的下降等后果。

7、我们面对ReentrantLock和synchronized改如何选择?
Synchronized相比Lock,为许多开发人员所熟悉,并且简洁紧凑,如果现有程序已经使用了内置锁,那么尽量保持代码风格统一,尽量不引入Lock,避免两种机制混用,容易令人困惑,也容易发生错误。在Synchronized无法满足需求的情况下,Lock可以作为一种高级工具,这些功能包括”可定时的、可轮询的与可中断的锁获取操作,公平队列,以及非块结构的锁”否则还是优先使用Synchronized。最后,未来更可能提升Synchronized而不是Lock的性能,因为Synchronized是JVM的内置属性,他能执行一些优化,例如对线程封闭的锁对象的锁消除优化,通过增加锁的粒度来消除内置锁的同步,而如果基于类库的锁来实现这些功能,则可能性不大

8、死锁与其产生的四个条件

死锁:若干进程之间竞争资源,又推进顺序不当,从而形成无限循环等待的局面

  • 互斥条件:一个资源每次只能被一个进程使用
  • 不可剥夺条件:进程获得的资源,在未使用完之前,不能被强行剥夺
  • 请求和保持条件:进程因请求资源进而阻塞,对已获得的资源保持不放
  • 循环等待条件:若干进程之间形成的一种首尾相接的循环等待资源的关系

Original: https://www.cnblogs.com/ziweigege/p/16062292.html
Author: 紫薇哥哥
Title: 关于锁的基础知识

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/573136/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 拓扑排序(三)之 Java详解

    拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列。 这样说,可能理解…

    Java 2023年5月29日
    075
  • Windows Server 2012上安装.NET Framework 3.5

    工具提取( NET3.5安装包 提取码: a123)–来自百度网盘超级会员v4的分享 1.首先,先下载NET 3.5安装包,然后解压到想要安装的位置(比如:C盘下的WIN2012R…

    Java 2023年6月5日
    093
  • Java集合原理分析和知识点大杂烩(多图初学者必备!!)

    一、数据结构 ​ 数据结构就是计算机存储、组织数据的方式。 ​ 在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间,常用O符号来表述。​ 时间复杂度是同一问题…

    Java 2023年6月7日
    083
  • 设计模式之访问者模式

    大多数情况下你不需要访问者模式,但当一旦需要访问者模式时,那就是真的需要它了,这是设计模式创始人的原话。可以看出应用场景比较少,但需要它的时候是不可或缺的,这篇文章就开始学习最后一…

    Java 2023年6月8日
    080
  • Java Servlet单元测试

    Java Servlet单元测试 1. 解决痛点 虽然目前主流的开发方式,很多都是通过controll或者微服务提供api.但是不免还是需要写几个 servlet完成接口开发.按照…

    Java 2023年6月13日
    091
  • html学习笔记

    结构化标准语言(HTML、XML) 表现标准语言(CSS) 行为标准(DOM、ECMAScript) 网页基本标签 标题标签:到 段落标签: 换行标签: 水平线标签: 字体样式标签…

    Java 2023年6月5日
    064
  • Java内部类

    Java中可以将一个类定义在另一个类中或一个方法中,这样的类称为 内部类 内部类一般来说分为下面几种: 成员内部类(可以分为静态成员内部类、非静态成员内部类) 局部内部类 匿名内部…

    Java 2023年6月13日
    073
  • Nginx 配置 https 和 配置 允许指定域名下所有二级域名跨域请求

    Nginx 配置 https 和 配置 允许指定域名下所有二级域名跨域请求 如果网站 的地址 在 https://www.domain.xyz 上, 这个网站后端服务在 http:…

    Java 2023年5月30日
    0108
  • mybatis selectkey ‘id’ attribute should be defined

    1.情景展示 在idea当中,使用selectKey标签,错误信息提示:selectkey ‘id’ attribute should be defined…

    Java 2023年5月30日
    082
  • TypeScript(3)基础类型

    基础类型 TypeScript 支持与 JavaScript 几乎相同的数据类型,此外还提供了实用的枚举类型方便我们使用。 布尔值 最基本的数据类型就是简单的true/false值…

    Java 2023年6月9日
    057
  • Spring MVC 常见问题

    Spring MVC的主要组件有那些? spring mvc 在使用 DispatcherServlet 处理 web 请求的时候,会用到 spring 中的九大组件,以下是几个关…

    Java 2023年6月5日
    065
  • 盘点飞思卡尔i.MX多媒体处理器前世今生 (转)

    现如今,移动处理器领域,大家关注最多的是德州仪器、高通、展讯、MTK,甚至包括Intel,但是请别忘记飞思卡尔,他的i.MX处理器已经发展到第六代。那么我们今天就来盘点下i.MX的…

    Java 2023年6月6日
    0104
  • 使用7z程序CLI实现基础功能

    阅文时长 | 0.64分钟字数统计 | 1025.6字符主要内容 | 1、引言&背景 2、压缩 3、解压 4、更多命令可见 5、声明与参考资料『使用7z程序CLI实现基础功…

    Java 2023年6月5日
    077
  • 【SpringBoot】【2】多模块项目共享公共的配置文件

    前言: 项目有多个module的时候,其实很多参数都是一样的,每个module都配置的话很累赘而且不易于修改,所以可以将公共的东西独立出来。 正文: 1,创建独立的module,存…

    Java 2023年5月29日
    059
  • Java源码赏析(一)Object 类

    写这个系列的原因,其实网上已经有无数源码分析的文章了,多一篇不多,少一篇不少,但为什么还要写这部分文章呢?于私,其一,上班族已经很久没有打过完整的一整段有意义的话,算是锻炼个人的书…

    Java 2023年6月8日
    074
  • plugin.xml 解析说明

    plugin.xml文件定义插件所需的结构和设置 plugin主体 示例: 参数: 基础标签 示例: Camera Cordova Camera Plugin Apache 2.0…

    Java 2023年6月9日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球