lock与synchronized锁有什么区别?它们的底层实现原理是什么?
一、共同点
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锁有什么区别?它们的底层实现原理是什么?相关推荐
- Java同步锁——lock与synchronized 的区别【转】
在网上看来很多关于同步锁的博文,记录下来方便以后阅读 一.Lock和synchronized有以下几点不同: 1)Lock是一个接口,而synchronized是Java中的关键字,synchroni ...
- Lock锁与synchronized锁的区别
Lock锁与synchronized锁的区别 1.synchronized锁是可以帮助我们自动开锁和关闭锁 2.Lock锁,我们最常用的是ReentrantLock重入锁,需要我们手动的开锁和手动关锁 ...
- java同步锁售票_Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)...
学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是 ...
- JUC多线程:synchronized锁机制原理 与 Lock锁机制
前言: 线程安全是并发编程中的重要关注点,造成线程安全问题的主要原因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案,当存在多 ...
- Lock和Synchronized区别
https://blog.csdn.net/zhangcanyan/article/details/80284586 一.synchronized和lock的用法区别 synchronized:在需要 ...
- lock和synchronized的区别
lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现:(具体实现上的区别在<Java虚拟机>中有讲解底层的CAS不同,以前有读过现 ...
- java多线程:9、synchronized、Lock的底层实现原理以及和volatile、Lock、ReentrantLock的区别?
文章目录 0.1.线程中安全性问题的体现: 0.2.线程安全问题的解决办法 1.synchronized的底层实现原理分析 2.Lock的底层实现原理分析? 3.synchronized和volati ...
- 萌新必入!手把手教你玩转Synchronized锁和Lock锁!
文章目录 声明 前言 Synchronized锁 Lock锁 Synchronized与Lock区别 生产者与消费者问题 Synchronized Lock 8锁现象 后记 声明 1)该文章部分内容整 ...
- synchronized、Lock和 redis锁,基于redis实现的扣减库存锁(附代码)
目录 锁的概念 公平锁 可中断锁 可重入锁 几种加锁方式 synchronized Lock Lock接口的6个方法: Lock的实现类 ReentrantLock 可重入锁 ReadWriteLoc ...
最新文章
- Flutter 最佳实践 | 专家直播答疑
- Hadoop(十五)MapReduce程序实例
- CSS-3 Animation 的使用
- Linux上如何查看物理CPU个数,核数,线程数
- 本学期的选修课:动感单车
- bash的简单for循环
- linux系统下4k对齐,linux查看硬盘4K对齐方法
- Redis学习第八课:Redis高级实用特性(一)
- 桌面计算机打开不了怎么办,电脑桌面上的所有东西都打不开了 怎么处理
- 计算机应用基础学生自查报告,计算机应用基础(专科).docx
- 2000年考研英语阅读理解文章五
- 编程加速服务器_英特尔:将可编程加速进行到底
- PP-OCR论文笔记
- python上下文管理器ContextLib及with语句
- SMA、SPI、LTE
- 【校招VIP】前端js语言考点之事件冒泡与捕捉
- 高效准确处理scipy.misc 中imresize、imread导入错误问题
- b站会员转正自动答题
- 创新认知 基于LPC1114单片机的传感器使用
- [论文笔记]Feature-constrained Active Visual SLAM for Mobile Robot Navigation