1、悲观锁和乐观锁

悲观锁:当前线程去操作数据的时候,总是认为别的线程会去修改数据,所以每次操作数据的时候都会上锁,别的线程去操作数据的时候就会阻塞,比如synchronized;

乐观锁:当前线程每次去操作数据的时候都认为别人不会修改,更新的时候会判断别人是否会去更新数据,通过版本来判断,如果数据被修改了就拒绝更新,例如cas是乐观锁,但是严格来说并不是锁,通过原子性来保证数据的同步,例如数据库的乐观锁,通过版本控制来实现,cas不会保证线程同步,乐观的认为在数据更新期间没有其他线程影响

总结:悲观锁适合写操作多的场景,乐观锁适合读操作多的场景,乐观锁的吞吐量会比悲观锁高

2、公平锁和非公平锁

公平锁:有多个线程按照申请锁的顺序来获取锁,就是说,如果一个线程组里面,能够保证每个线程都能拿到锁,例如:ReentrantLock(使用的同步队列FIFO)

非公平锁:获取锁的方式是随机的,保证不了每个线程都能拿到锁,会存在有的线程饿死,一直拿不到锁,例如:synchronized,ReentrantLock

总结:非公平锁性能高于公平锁,更能重复利用CPU的时间

3、可重入锁和不可重入锁

可重入锁:也叫递归锁,在外层使用锁之后,在内层仍然可以使用,并且不会产生死锁

不可重入锁:在当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞

总结:可重入锁能一定程度的避免死锁,例如:synchronized,ReentrantLock

4、自旋锁

自旋锁:一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环,任何时刻最多只能有一个执行单元获得锁

总结:不会发生线程状态的切换,一直处于用户态,减少了线程上下文切换的消耗,缺点是循环会消耗CPU

5、共享锁和独享锁

共享锁:也叫读锁,可以查看数据,但是不能修改和删除的一种数据锁,加锁后其他的用户可以并发读取,但不能修改、增加、删除数据,该锁可被多个线程持有,用于资源数据共享

独享锁:也叫排它锁、写锁、独占锁、独享锁,该锁每一次只能被一个线程所持有,加锁后任何线程试图再次加锁都会被阻塞,直到当前线程解锁。例如:线程A对data加上排它锁后,则其他线程不能再对data加任何类型的锁,获得互斥锁的线程既能读数据又能修改数据

Java中的锁有哪些?相关推荐

  1. Java中的锁原理、锁优化、CAS、AQS详解

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:景小财 www.jianshu.com/p/e674ee68 ...

  2. 一篇blog带你了解java中的锁

    前言 最近在复习锁这一块,对java中的锁进行整理,本文介绍各种锁,希望给大家带来帮助. Java的锁 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人 ...

  3. Java中的锁[原理、锁优化、CAS、AQS]

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:用好Java中的枚举,真的没有那么简单!个人原创+1博客:点击前往,查看更多 作者:高广超 链接:https:/ ...

  4. Java中的锁原理、锁优化、CAS、AQS详解!

    阅读本文大概需要 2.8 分钟. 来源:jianshu.com/p/e674ee68fd3f 一.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 二.锁实现的基本原理 2.1.v ...

  5. JAVA 中无锁的线程安全整数 AtomicInteger介绍和使用

    转载自 http://blog.csdn.net/bigtree_3721/article/details/51296064 JAVA 中无锁的线程安全整数 AtomicInteger,一个提供原子操 ...

  6. 面试官让我讲讲Java中的锁,我笑了

    转载自  面试官让我讲讲Java中的锁,我笑了 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁 ...

  7. Java中的锁(转)

    Java中的锁 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂.因为锁(以及其它更高级的线程同步机制)是由synchronized同步 ...

  8. 一文足以了解什么是 Java 中的锁

    作者 |  cxuan 责编 | Elle Java 锁分类 Java 中的锁有很多,可以按照不同的功能.种类进行分类,下面是我对 Java 中一些常用锁的分类,包括一些基本的概述 从线程是否需要对资 ...

  9. 关于Java中的锁,看这一篇就够了(总结篇)

    文章目录 锁的概念 锁的分类 一.什么是悲观锁? Java中的悲观锁有哪些 synchronized 基于AQS的实现类 二.什么是乐观锁? Java中的乐观锁有哪些 Valotile Java内存模 ...

  10. java中的锁(悲观锁、乐观锁、可重入锁、不可重入锁、公平锁、非公平锁、自旋锁、阻塞锁...)

    Lock接口 1.简介.地位.作用 ① 锁是一种工具,用于控制对共享资源的访问 ② Lock和synchronized,这两个是最常见的锁,它们都可以达到线程安全的目的,但是在使用和功能上又有较大的不 ...

最新文章

  1. 在文件log 加入commit id_从物理文件理解InnoDB Redo Log
  2. 本人制作的股票技术分析软件正式开源(.net wpf)
  3. 关卡CyclicBarrier的使用
  4. java虚拟机改装_java虚拟机线上配置
  5. MariaDB 10.0 和 MySQL 5.6 有何不同
  6. 架构师经常参考的Netflix架构,它的全貌是怎样的?
  7. php联想输入,自动联想搜索提示功能
  8. linux 7 定时任务设置,centos7 配置crontab定时任务
  9. C/C++之win98扫雷外挂基础篇
  10. CMSimple内容管理系统
  11. vb按热键启动应用程序
  12. 【Java】多线程编程
  13. 我的开源项目:FLV封装格式分析器
  14. Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js
  15. 面对性骚扰,Siri Alexa等AI助手如何应对
  16. RoboWare Studio 安装教程与可能问题解决
  17. ADSL上网全攻略——故障解决
  18. springBoot 文件压缩加密
  19. [论文]深度强化学习在超视距空战机动规划的应用
  20. 华东师范计算机科学与技术 导师,钱莹 - 华东师范大学 - 计算机科学与技术学院...

热门文章

  1. 引入高速缓存的目的_计算机中高速缓存的作用?
  2. 【短道速滑四】Halcon的texture_laws算子自我研究
  3. Cookie的path和diamon
  4. 计算机病毒进化趋势,人类进化趋势是什么?
  5. html 左侧固定导航栏,前端布局-固定导航栏与侧边栏
  6. 武汉大学计算机学院2018夏令营,武汉大学
  7. 生物信息-McScan(Python-jcvi)共线性画图
  8. 遇见心想事成的自己……
  9. 前端秘籍,CSS垂直居中必学八式,一招一式尽显功力
  10. 88个word基本使用技巧大全,提升工作效率