首页 > 编程语言 >面试java并发~(lock、volatile、cas)

面试java并发~(lock、volatile、cas)

时间:2022-09-06 09:22:45浏览次数:56  
标签:java Synchronized cas lock 原子 线程 volatile condition


Lock 锁

是一个接口,有三个实现类,分别是常用的可重入锁,读锁、写锁。
常用的可重入锁,默认一般创建的是非公平锁,就是允许线程插队,而不是按先来后到顺序。
非公平锁的目的:是为了更加公平。
lock 加锁,调用的是 lock() 方法,解锁,调用 unlock() 方法。


lock 锁 和 Synchronized 的区别:

1、Synchronized 是一个关键字,修饰符,而 lock 是一个 接口,有具体的实现类
2、因为Synchronized 是一个关键字,它无法判断锁的状态,而lock 可以判断是否拿到锁;
还有 Synchronized 也无法中断线程的执行,而lock 可以通过设置中断。
3、Synchronized 会自动释放锁,而 lock 必须手动释放锁,否则会死锁。
4、在生产者-消费者模型的问题上,和Synchronized 比较, lock 可以做到更加精准的通知

线程通信(生产者、消费者):判断等待、业务、通知

syn:加锁,直接添加到方法上,调用this.wait() 等待; this.notifyAll() 通知;
lock: 需要 condition, condition.await(); condition.signlAll()



Volatile

保证可见性、禁止指令重排、但是不保证原子性

原子性问题的解决:可以使用原子类,比如整型,可以使用AtomicInteger
原子类的底层实现是 Unsafe 类,是和操作系统挂钩

volatile可以避免指令重排: 内存屏障



CAS

底层也是使用了Unsafe 类
比较当前线程的工作内存中的值和主内存中的值,如果这个值是期望的,那么则执行操作!如果不是就 一直循环!(涉及到自旋锁思想)

缺点:
循环会耗时
ABA问题

解决ABA 问题,引入原子引用! 对应的思想:乐观锁
即添加一个版本号

标签:java,Synchronized,cas,lock,原子,线程,volatile,condition
From: https://www.cnblogs.com/shan333/p/16660585.html

相关文章

  • java通过内存流去掉多行文本中的空行
    对于多行文本,你直接通过replace,replaceAll是不能将空行删除的,你需要遍历这些行,对每行文本进行操作,最后把返回新的文本才行。publicstaticStringremoveMultiRowBla......
  • 你需要了解多少 Javascript 才能开始使用 React?
    你需要了解多少Javascript才能开始使用React?1.Javascript基础一个。使用var、let和const进行变量声明湾。算术、比较、逻辑运算符C。条件块和循环:if、for、f......
  • 如何用 JavaScript 编写游戏
    如何用JavaScript编写游戏今天的浏览器允许您创建具有完整图形的游戏。以下是使用JavaScript和HTML5编写简单赛车游戏的方法。浏览器现在为JavaScript开发人员提......
  • Java学习-第一部分-第二阶段-项目实战:坦克大战【3】
    坦克大战【3】笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html)坦克大战0.6版√增加功能防止敌人坦克重叠运动记录玩家的成绩(累积击毁敌方坦克数),......
  • Java Servlet 入门: 问题系列:No compiler is provided in this environment. Perhaps y
    问题:用Maven编绎运行时,如果系统引用的JRE运行库,而不是JDK开发运行库,则会抛异常。 解决:在eclipse的菜单中,进入Window>Preferences>Java>InstalledJREs->Add......
  • MAC设置JAVA环境变量
    JAVA.bash_profile为每个用户配置环境变量,用户登录后会自动读取一次我们切换到当前用户主目录,然后编辑.bash_profile文件cd~vim.bash_profile输入内容假如我们有......
  • 学习现代 JavaScript (ES6+) 的基础知识
    学习现代JavaScript(ES6+)的基础知识您应该在代码中开始使用的10个现代功能您可能已经知道JavaScript是一种功能丰富的编程语言,每次更新都会不断增强。有很多事......
  • 动画标签 HTML CSS JavaScript
    动画标签HTMLCSSJavaScript动画标签HTMLCSSJavaScript免费下载HTML:<linkrel="样式表"href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1......
  • Javaweb-smbms项目搭建
    smbms创建maven项目选择webapp创建配置文件,将web.xml改为4.0版本<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"......
  • Java---线程入门
    前置知识什么是进程,什么又是线程?咱不是讲系统,简单说下,知道个大概就好了。进程:一个可执行文件执行的过程。线程:操作系统能够进行运算调度的最小单位。它被包含在进程之......