锁是用于控制多线程对共享资源的访问。 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锁机制总结的更多相关文章

  1. 转 : 深入解析Java锁机制

    深入解析Java锁机制 https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw%3D%3D&mid=2247485524&idx=1&s ...

  2. Java 锁机制总结

    锁的种类 独享锁 VS 共享锁 独享锁:锁只能被一个线程持有(synchronized) 共享锁:锁可以被多个程序所持有(读写锁) 乐观锁 VS 悲观锁 乐观锁:每次去拿数据的时候都乐观地认为别人不会 ...

  3. java锁机制的面试题

    java锁机制的面试题 1.ABA问题 2.CAS乐观锁 3.synchronize实现原理 4.synchronize与lock的区别 5.volatile实现原理 6.乐观锁的业务场景及实现方式 ...

  4. Java锁机制深入理解

    Java锁机制 背景知识 指令流水线 ​ CPU的基本工作是执行存储的指令序列,即程序.程序的执行过程实际上是不断地取出指令.分析指令.执行指令的过程. ​ 几乎所有的冯•诺伊曼型计算机的CPU,其工 ...

  5. java锁机制

    2.4 锁机制        临界区是指,使用同一个锁控制的同一段代码区或多段代码区之间,在同一时间内最多只能有一个线程在执行操作.这个概念与传统的临界区有略微的差别,这里不想强调这些概念上的差别,临 ...

  6. Java锁机制了解一下

    前言 回顾前面: 多线程三分钟就可以入个门了! Thread源码剖析 多线程基础必要知识点!看了学习多线程事半功倍 只有光头才能变强! 本文章主要讲的是Java多线程加锁机制,有两种: Synchro ...

  7. JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁,

    如果需要查看具体的synchronized和lock的实现原理,请参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度) 在并发编程中,经常遇到多个线程访问同一个 ...

  8. JAVA锁机制(上)

    在实际开发中经常会用到多线程协作来处理问题,锁是处理线程安全不可缺少的机制.在JAVA中可以通过至少三种方式来实现线程锁. 1.  synchronized修饰符,这种锁机制是虚拟机实现的一种锁. 2 ...

  9. java 锁机制(synchronized 与 Lock)

    在java中,解决同步问题,很多时候都会使用到synchronized和Lock,这两者都是在多线程并发时候常使用的锁机制. synchronized是java中的一个关键字,也就是说是java内置的 ...

  10. 【面试专栏】JAVA锁机制

    1. 悲观锁 / 乐观锁   在Java和数据库中都存在悲观锁和乐观锁的应用.Mysql锁机制中的悲观锁和乐观锁请查看:   Mysql锁机制--悲观锁和乐观锁   悲观锁:在获得数据时先加锁,只到数 ...

随机推荐

  1. Servlet 响应及请求信息

    // 文件路径 D:\ApacheServer\web_java\HelloWorld\src\com\test\TestServletRequestrResponse.java package co ...

  2. SQL,NoSQL和NewSQL

    一:概念 SQL(Structured Query Language):数据库,指关系型数据库.主要代表:SQL Server.Oracle.MySQL.PostgreSQL. NoSQL(Not O ...

  3. Linux下使用Vim粘贴文本错乱问题解决

    在使用vim进行文档操作时,经常需要进行复制粘贴,在粘贴大量代码时,出现行错位等各种错乱,查找问题解决办法: vim进入文件后,先ESC 在出入 :set paste  回车后再按下 i  之后进行粘 ...

  4. Hystrix的介绍(断路、降级)

    在大中型分布式系统中,通常系统很多依赖(HTTP,hession,Netty,Dubbo等),如下图:     在高并发访问下,这些依赖的稳定性与否对系统的影响非常大,但是依赖有很多不可控问题:如网络 ...

  5. scrapy 爬取纵横网实战

    前言 闲来无事就要练练代码,不知道最近爬取什么网站好,就拿纵横网爬取我最喜欢的雪中悍刀行练手吧 准备 python3 scrapy 项目创建: cmd命令行切换到工作目录创建scrapy项目  两条命 ...

  6. spring cloud微服务实践三

    上篇文章里我们实现了spring cloud中的服务提供者和使用者.接下来我们就来看看spring cloud中微服务的其他组件. 注:这一个系列的开发环境版本为 java1.8, spring bo ...

  7. SAS学习笔记30 SAS各种常用随机函数

    UNIFORM(seed) 产生(0,1)区域均匀分布随机数,乘同余发生器 RANUNI(seed) 产生(0,1)区域均匀分布随机数,素数模发生器 NORMAL(seed) 产生标准正态分布随机数, ...

  8. 103 保序回归 isotonic regression

    103 保序回归 isotonic regression 2016-03-30 11:25:27 bea_tree 阅读数 6895   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权 ...

  9. mybatis相关知识积累

    mybatis Statement Statement对象用于将 SQL 语句发送到数据库中. 实际上有三种 Statement 对象,它们都作为在给定连接上执行 SQL语句的包容器: Stateme ...

  10. Map 集合遍历的4种方法

    Map 集合初始化时,指定集合初始值大小. 说明:HashMap 使用 HashMap(int initialCapacity) 初始化. 正例:initialCapacity = (需要存储的元素个 ...