Java锁机制总结
锁是用于控制多线程对共享资源的访问。 Java中的锁可以分为内置锁与显式锁Lock。其中内置锁指synchronized关键字。
Synchronized
synchronized可以修饰方法或代码块(在修饰代码块时,会在编译后在代码块前后加入monitorenter和monitorexit指令,修饰方法时会在方法上加入ACC_SYNCHRONIZED访问标志),在修饰静态方法时获取到的是类锁,否则是对象锁。线程在访问方法或代码块时,必须先获得锁,否则会进入阻塞状态。
synchronized在JDK 6进行了优化,每个对象有 无锁、偏向锁、轻量级锁和重量级锁四种状态,存在于对象头中。偏向锁指认为多数情况下不存在多线程竞争,对于第一个线程不需要获得锁;轻量级锁是在偏向锁被两个线程访问时,线程通过CAS和自旋的方式获得锁,不会发生阻塞。当有多个线程同时访问锁时,升级为重量级锁,一个线程获得锁,其他线程被阻塞。
Lock
Lock提供了扩展功能。ReentrantLock实现了Lock接口,它有可中断、可轮询,可以设置公平锁或非公平锁。它继承了AQS这个基类,其中核心的两个方法是tryAcquire和tryRelease,它使用CAS操作来获取锁与释放锁。其他的显式锁还包括Semaphore、CountDownLatch、读写锁等,他们都继承了AQS,其中Semaphore信号量可以使多个线程访问共享变量,CountDownLatch可以使主线程等待所有线程运行完后再继续向下执行。
概念
乐观锁&悲观锁
乐观锁指认为数据不会被修改,所以不会加锁,而是在每次修改前判断其他线程是否更新了数据;悲观锁指默认每次更新数据时都会发生竞争,所以在更新前都会加锁,其他线程陷入BLOCK直到获取锁。
自旋锁
线程获取锁失败后不会被挂起,而是采用循环的方式尝试获得锁,减少了上下文切换的开销。适用于锁竞争不激烈的场景。
公平锁&非公平锁
公平锁指严格按照先进先出的原则获取锁,非公平锁不按这个规则,效率更高。
Java锁机制总结的更多相关文章
- 转 : 深入解析Java锁机制
深入解析Java锁机制 https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw%3D%3D&mid=2247485524&idx=1&s ...
- Java 锁机制总结
锁的种类 独享锁 VS 共享锁 独享锁:锁只能被一个线程持有(synchronized) 共享锁:锁可以被多个程序所持有(读写锁) 乐观锁 VS 悲观锁 乐观锁:每次去拿数据的时候都乐观地认为别人不会 ...
- java锁机制的面试题
java锁机制的面试题 1.ABA问题 2.CAS乐观锁 3.synchronize实现原理 4.synchronize与lock的区别 5.volatile实现原理 6.乐观锁的业务场景及实现方式 ...
- Java锁机制深入理解
Java锁机制 背景知识 指令流水线 CPU的基本工作是执行存储的指令序列,即程序.程序的执行过程实际上是不断地取出指令.分析指令.执行指令的过程. 几乎所有的冯•诺伊曼型计算机的CPU,其工 ...
- java锁机制
2.4 锁机制 临界区是指,使用同一个锁控制的同一段代码区或多段代码区之间,在同一时间内最多只能有一个线程在执行操作.这个概念与传统的临界区有略微的差别,这里不想强调这些概念上的差别,临 ...
- Java锁机制了解一下
前言 回顾前面: 多线程三分钟就可以入个门了! Thread源码剖析 多线程基础必要知识点!看了学习多线程事半功倍 只有光头才能变强! 本文章主要讲的是Java多线程加锁机制,有两种: Synchro ...
- JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁,
如果需要查看具体的synchronized和lock的实现原理,请参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度) 在并发编程中,经常遇到多个线程访问同一个 ...
- JAVA锁机制(上)
在实际开发中经常会用到多线程协作来处理问题,锁是处理线程安全不可缺少的机制.在JAVA中可以通过至少三种方式来实现线程锁. 1. synchronized修饰符,这种锁机制是虚拟机实现的一种锁. 2 ...
- java 锁机制(synchronized 与 Lock)
在java中,解决同步问题,很多时候都会使用到synchronized和Lock,这两者都是在多线程并发时候常使用的锁机制. synchronized是java中的一个关键字,也就是说是java内置的 ...
- 【面试专栏】JAVA锁机制
1. 悲观锁 / 乐观锁 在Java和数据库中都存在悲观锁和乐观锁的应用.Mysql锁机制中的悲观锁和乐观锁请查看: Mysql锁机制--悲观锁和乐观锁 悲观锁:在获得数据时先加锁,只到数 ...
随机推荐
- sqlserver交换数据行中的指定列
<!-- 次序上移下移 --> <update id="upOrDown" parameterType="java.util.Map"> ...
- ARTS第六周打卡
Algorithm : 做一个 leetcode 的算法题 1.合并两个排序链表 2.树的子结构 3.二叉树的镜像 4.包含Min函数的栈 5.栈的压入.弹出 6.二叉搜索树的后序遍历 7.从上往下打 ...
- Python——方法
方法是类或者对象行为特征的抽象,方法其实也是函数,它的定义方式.调用方式与函数都很相似. 一.类调用实例方法 先来看一段代码: # 定义全局空间test函数 def test(): print ('全 ...
- 用c++ sttring检测名字是否有空格
name.find(' ') == std::string::npos//npos==-1,表示没找到
- linux中部署jenkins(war包)及jenkins忘记登录账号密码
未登录状态 登录状态 一:部署jenkins(war包) 1.直接下载war包jenkins.war,下载地址https://jenkins.io/download 2.将下载的war包放到服务器上t ...
- 在CentOS部署AspNetCore网站
前段时间某云服务器大促,就买了一台打算折腾一下,买了几个月,却啥也没做,就改了个初始密码.最近快到双十一了,另一家厂商相同配置的服务器价格又便宜了一大截,看来又得剁手了.从今年开始,搜索一下云服务器, ...
- JDBC 学习复习9 配置Tomcat数据源
在实际开发中,我们有时候还会使用服务器提供给我们的数据库连接池,比如我们希望Tomcat服务器在启动的时候可以帮我们创建一个数据库连接池,那么我们在应用程序中就不需要手动去创建数据库连接池,直接使用T ...
- springboot mvc自动配置(一)自动配置DispatcherServlet和DispatcherServletRegistry
所有文章 https://www.cnblogs.com/lay2017/p/11775787.html 正文 springboot的自动配置基于SPI机制,实现自动配置的核心要点就是添加一个自动配置 ...
- python学习之掷骰子游戏
""" 通过学习的python知识,写一个简单的python小游戏 游戏名字:掷骰子比大小 游戏规则: 1.玩家可以选择玩掷几个骰子游戏(默认3个) 2.玩家可以设置双方 ...
- js之向div contenteditable光标位置添加字符
js之向div contenteditable光标位置添加字符 原理: 在HTML里面,光标是一个对象,光标对象是只有当你选中某个元素的时候才会出现的. 当我们去点击一个输入框的时候,实际上它会产生 ...