一、共同点

Lock和synchronized都是本地锁,它们都可以通过上锁解决多个线程访问共享资源的问题,并且synchronized和lock锁都支持可重入锁机制,即同一个线程在已经获得锁的情况下能够再次获取该锁

二、区别

(一)、synchronized只有一种锁类型就是独占锁,Lock 提供了更多的锁机制选择,例如公平锁、非公平锁,读写锁等

(二)、lock合适在高并发场景下使用,而synchronized适合在简单场景下使用

(三)、synchronized是关键字,源码在jvm中,用c++ 语言实现。Lock 是接口,源码由jdk 提供,用java语言实现

(四)、synchronized退出同步代码块jvm会自动释放锁,Lock不会自动释放锁,需要调用unlock方法手动释放锁,不然可能会造成死锁问题。

5、synchronized锁是悲观锁,lock是乐观锁

三、synchronized原理

首先synchronized普通同步方法,锁是当前实例对象;静态同步方法,锁是当前类的 class 对象;同步方法块,锁是括号里面的对象。

(一)、synchronized保证了共享变量可见性和原子性,共享变量可见性是通过JVM底层的内存屏障来实现的,原子性则是通过监视器锁的互斥性来实现的。
(二)、在synchronized内线程获得了锁,它将会清空工作内存,从而使得该线程使用的变量能够从主内存中重新读取,同时也会把工作内存中的变量写回到主内存中。这样,其他线程就可以读取到最新的值,从而保证了可见性。

四、lock锁的原理

(一)、lock是一个接口,实际开发中我们经常用它的是实现类来上锁。

      ReentrantLock lock = new ReentrantLock();  // 创建一个 ReentrantLock 对象// 加锁lock.lock();try {// 被锁住的代码块} finally {// 释放锁lock.unlock();}

(二)、CAS算法实现上锁和解锁

1、lock锁是通过CAS乐观锁算法实现的,当一个线程调用lock()方法时,它会尝试获取锁,该方法会使用CAS操作(原子性)来尝试获取锁。

2、如果当前锁没有被其他线程占用,那么这个线程就会获取锁,并成为锁的持有者;

3、当其他线程尝试获取锁时,但因为锁已经被持有者持有,所以它们会一直尝试获取锁直到锁被释放。

4、当持有锁的线程调用unlock()方法时,它会释放锁并成为锁的持有者;

5、当其他线程尝试获取锁时,它们会被放入等待队列中,并且当锁被释放时,等待队列中的线程会被通知来获取锁。

lock与synchronized锁有什么区别?它们的底层实现原理是什么?相关推荐

  1. Java同步锁——lock与synchronized 的区别【转】

    在网上看来很多关于同步锁的博文,记录下来方便以后阅读 一.Lock和synchronized有以下几点不同: 1)Lock是一个接口,而synchronized是Java中的关键字,synchroni ...

  2. Lock锁与synchronized锁的区别

    Lock锁与synchronized锁的区别 1.synchronized锁是可以帮助我们自动开锁和关闭锁 2.Lock锁,我们最常用的是ReentrantLock重入锁,需要我们手动的开锁和手动关锁 ...

  3. java同步锁售票_Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)...

    学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是 ...

  4. JUC多线程:synchronized锁机制原理 与 Lock锁机制

    前言: 线程安全是并发编程中的重要关注点,造成线程安全问题的主要原因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案,当存在多 ...

  5. Lock和Synchronized区别

    https://blog.csdn.net/zhangcanyan/article/details/80284586 一.synchronized和lock的用法区别 synchronized:在需要 ...

  6. lock和synchronized的区别

    lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现:(具体实现上的区别在<Java虚拟机>中有讲解底层的CAS不同,以前有读过现 ...

  7. java多线程:9、synchronized、Lock的底层实现原理以及和volatile、Lock、ReentrantLock的区别?

    文章目录 0.1.线程中安全性问题的体现: 0.2.线程安全问题的解决办法 1.synchronized的底层实现原理分析 2.Lock的底层实现原理分析? 3.synchronized和volati ...

  8. 萌新必入!手把手教你玩转Synchronized锁和Lock锁!

    文章目录 声明 前言 Synchronized锁 Lock锁 Synchronized与Lock区别 生产者与消费者问题 Synchronized Lock 8锁现象 后记 声明 1)该文章部分内容整 ...

  9. synchronized、Lock和 redis锁,基于redis实现的扣减库存锁(附代码)

    目录 锁的概念 公平锁 可中断锁 可重入锁 几种加锁方式 synchronized Lock Lock接口的6个方法: Lock的实现类 ReentrantLock 可重入锁 ReadWriteLoc ...

最新文章

  1. Flutter 最佳实践 | 专家直播答疑
  2. Hadoop(十五)MapReduce程序实例
  3. CSS-3 Animation 的使用
  4. Linux上如何查看物理CPU个数,核数,线程数
  5. 本学期的选修课:动感单车
  6. bash的简单for循环
  7. linux系统下4k对齐,linux查看硬盘4K对齐方法
  8. Redis学习第八课:Redis高级实用特性(一)
  9. 桌面计算机打开不了怎么办,电脑桌面上的所有东西都打不开了 怎么处理
  10. 计算机应用基础学生自查报告,计算机应用基础(专科).docx
  11. 2000年考研英语阅读理解文章五
  12. 编程加速服务器_英特尔:将可编程加速进行到底
  13. PP-OCR论文笔记
  14. python上下文管理器ContextLib及with语句
  15. SMA、SPI、LTE
  16. 【校招VIP】前端js语言考点之事件冒泡与捕捉
  17. 高效准确处理scipy.misc 中imresize、imread导入错误问题
  18. b站会员转正自动答题
  19. 创新认知 基于LPC1114单片机的传感器使用
  20. [论文笔记]Feature-constrained Active Visual SLAM for Mobile Robot Navigation

热门文章

  1. HTML5 基础知识总结(全)
  2. 【Excle数据透视表】如何快速选取所有标签并标注黄色底纹
  3. canvas画矩形方法
  4. 欢迎来到 江南儒生 的技术博客
  5. kettle提示:ArrayIndexOutOfBoundsException
  6. Vue2项目运行报错
  7. 街景字符识别baseline
  8. Window setInterval() 方法介绍
  9. 如何在Linux上恢复误删除的文件或目录
  10. 面试官让我设计一个基于分布式锁的库存超卖方案,并发量很高的那种