首页 > 试题广场 >

说说Java中常用的锁及原理

[问答题]
说说Java中常用的锁及原理
对象头、AQS标准;Java中加锁有两种方式,分别是synchronized关键字和Lock接口,而Lock接口的经典实现是ReentrantLock
发表于 2022-05-05 17:55:06 回复(0)
synchronized关键字和lock锁接口:synchronized关键字底层采用java对象头来存储锁信息的。lock锁接口是基于AQS实现的。AQS内部定义一个先进先出的队列实现锁的同步,同时还定义了同步状态来记录锁信息。
发表于 2022-06-23 11:11:57 回复(0)
Java中加锁有两种方式,分别是synchronized关键字和Lock接口,而Lock接口的经典实现是ReentrantLock。另外还有ReadWriteLock接口,它的内部设计了两把锁分别用于读写,这两把锁都是Lock类型,它的经典实现是ReentrantReadWriteLock。其中,synchronized的实现依赖于对象头,Lock接口的实现则依赖于AQS。 synchronized的底层是采用Java对象头来存储锁信息的,对象头包含三部分,分别是Mark Word、Class Metadata Address、Array length。其中,Mark Word用来存储对象的hashCode及锁信息,Class Metadata Address用来存储对象类型的指针,而Array length则用来存储数组对象的长度。 AQS是队列同步器,是用来构建锁的基础框架,Lock实现类都是基于AQS实现的。AQS是基于模板方法模式进行设计的,所以锁的实现需要继承AQS并重写它指定的方法。AQS内部定义了一个FIFO的队列来实现线程的同步,同时还定义了同步状态来记录锁的信息。
发表于 2022-07-24 21:49:02 回复(0)
通过synchronized关键字和Lock接口 两种方式实现加锁 1.synchronized关键字通过monitor(同步监视器)来实现锁的获取和释放,每一个monitor相当于一个有序队列,底层通过java对象头的方式存储锁的信息,悲观锁 2.通过实现Lock接口,创建一个lock,显式指定锁对象,每一个锁对象就是一个condition,通过condition来实现线程同步,可以有多个,每个condition就是一个有序队列,synchronized的monitor也可以看成只有一个condition,相比synchronized的Lock更灵活灵活,Lock底层是通过AQS抽象同步队列实现FIFO有序队列,同时还定义了同步状态state来记录锁的信息
编辑于 2023-02-22 17:55:57 回复(0)
java中的锁主要分为两类:synchronied关键字和Lock接口 1、synchronied关键字实现锁依赖于对象头,对象头存储了锁的信息,利用monitornter和monitorexit指令实现 2、Lock接口依赖AQS实现锁机制,lock接口的实现类都继承自AQS,AQS是对列同步器,内部维护了一个队列来实现线程同步和一个volatile修饰的变量记录锁的信息
发表于 2023-03-15 15:09:43 回复(0)
1.Java中加锁有两种方式,分别是synchronized关键字和Lock接口,而Lock接口的经典实现是ReentrantLock

2.另外还有ReadWriteLock接口,它的内部设计了两把锁分别用于读写,这两把锁都是Lock类型,它的经典实现是ReentrantReadWriteLock。 3.其中,synchronized的实现依赖于对象头,Lock接口的实现则依赖于AQS。

4.synchronized的底层是采用Java对象头来存储锁信息的,对象头包含三部分,分别是Mark Word、Class Metadata Address、Array length。
5.其中,Mark Word用来存储对象的hashCode及锁信息,Class Metadata Address用来存储对象类型的指针,而Array length则用来存储数组对象的长度。

4.AQS是队列同步器,是用来构建锁的基础框架,Lock实现类都是基于AQS实现的。
5.AQS是基于模板方法模式进行设计的,所以锁的实现需要继承AQS并重写它指定的方法。
6.AQS内部定义了一个FIFO的队列来实现线程的同步,同时还定义了同步状态来记录锁的信息。

7.ReentrantLock通过内部类Sync定义了锁,它还定义了Sync的两个子类FrSync和NonfrSync,这两个子类分别代表公平锁和非公平锁。
8.此外,ReentrantReadWriteLock内部包含读和写两把锁,这两把锁都是由Sync来实现的。区别在于读锁支持共享,即多个线程可以同时加读锁成功,而写锁是互斥的,即只能有一个线程加锁成功。
编辑于 2023-03-09 14:15:04 回复(0)
22
发表于 2023-02-28 11:58:33 回复(0)
1、内置锁(synchronized关键字): 原理:内置锁是Java中最基本的锁,它基于对象的监视器(Monitor)机制实现。每个Java对象都有一个与之关联的Monitor,当一个线程尝试进入同步代码块或方法时,它会尝试获取Monitor的锁,如果锁被其他线程持有,那么该线程将进入阻塞状态,直到锁被释放。 常见用法:内置锁适用于最简单的线程同步需求,通常用于关键代码段或方法上。 2、ReentrantLock: 原理:ReentrantLock是基于可重入性的锁,它使用了一种类似内置锁的机制,但提供了更多的灵活性和控制。它允许一个线程多次获取同一把锁,而不会死锁。ReentrantLock使用非公平策略(默认情况下)来控制锁的获取。 常见用法:ReentrantLock适用于需要更复杂同步控制的情况,如可中断锁、定时锁、公平锁等。 3、ReadLock和WriteLock: 原理:ReadLock和WriteLock是ReentrantReadWriteLock的一部分,它允许多个线程同时读取共享资源,但只允许一个线程写入资源。这种分离读写的方式可以提高并发性。 常见用法:适用于读多写少的情况,可以提高性能。 4、StampedLock: 原理:StampedLock是Java 8引入的新锁,它结合了读写锁和乐观锁的特性。StampedLock允许多个线程同时读取共享资源,并支持乐观锁,可以在不阻塞其他线程的情况下尝试写入资源。 常见用法:适用于读多写少的情况,特别是读操作远远多于写操作的情况。
发表于 2023-09-22 11:08:02 回复(0)
java中常用的锁有synchronized关键字和lock接口
发表于 2022-12-04 20:41:27 回复(0)
m
发表于 2022-10-12 15:21:38 回复(0)
synchronized和lock,synchronized是关键字,lock是接口,synchronized是隐式的加锁,lock是显示加锁,synchronized底层是objectmonitor,lock底层是AQS,synchronized是阻塞枷锁,lock是中断式加锁,支持超时时间的加锁。java的lock锁机制就是通过unsafe类中的原生方法CAS,让多线程竞争AQS中的volatile修饰的state变量(0表示无主,可以竞争)。对于无法获取锁的线程则通过双向队列的维持,借助unsafe中的park功能对这些线程设置程等待。在锁被释放之后,在去队列头通过unpark来唤醒该线程继续工作
编辑于 2024-04-03 10:12:55 回复(0)
synchronized锁和Lock锁 Lock锁最常用的RentrantLock锁和Read WriteLock和RentrantReadWriteLock锁,前者依赖于对象头后者依赖于AQS方式来实现,对象头有3部分 MarkWOrd metaData Arraylength。MarkWOrd 存储对象的hashcode和锁信息,metadata存储对象类型指针,arraylength存储对象数组的长度。AQs基于模板方法来实现的,内部定义了fifo先进先出的队列还定义了锁的状态信息state。
编辑于 2024-04-02 15:57:47 回复(0)
synchronized和lock,synchronized的是属于关键字,我们不需要控制锁的获得和锁的释放,它的话是属于非公平锁,lock需要开发人员自己手动的获取锁以及控制锁的释放,它有非公平和公平锁两种
发表于 2024-04-01 17:45:48 回复(0)
答:sychronized和lock。 sychronized通过对象的监视器锁实现,进入synchronized代码块时,它会尝试获取对象的监视器锁,如果锁已经被其他线程获取,则当前线程会进入等待队列,直到获取锁才能执行synchronized代码块。 lock锁需要手动获取和释放锁,原理与sychronized相似。一般在try-finally块中获取锁并在finally块中释放锁。
发表于 2024-03-27 21:48:50 回复(0)
Java中加锁有两种方式,分别是synchronized关键字和Lock接口,而Lock接口的经典实现是ReentrantLock。另外还有ReadWriteLock接口,它的内部设计了两把锁分别用于读写,这两把锁都是Lock类型,它的经典实现是ReentrantReadWriteLock。其中,synchronized的实现依赖于对象头,Lock接口的实现则依赖于AQS。 synchronized的底层是采用Java对象头来存储锁信息的,对象头包含三部分,分别是Mark Word、Class Metadata Address、Array length。其中,Mark Word用来存储对象的hashCode及锁信息,Class Metadata Address用来存储对象类型的指针,而Array length则用来存储数组对象的长度。 AQS是队列同步器,是用来构建锁的基础框架,Lock实现类都是基于AQS实现的。AQS是基于模板方法模式进行设计的,所以锁的实现需要继承AQS并重写它指定的方法。AQS内部定义了一个FIFO的队列来实现线程的同步,同时还定义了同步状态来记录锁的信息
编辑于 2024-03-06 19:51:19 回复(0)
编辑于 2024-03-06 16:08:28 回复(0)
synchronized和Lock锁 synchronized绑定的是对象头的信息 Lock锁的通过AQS来进行实现的(抽象队列同步器)先进先出 ReentrantLock
编辑于 2024-02-28 21:18:02 回复(0)
1. 常用锁:synchronize(关键字) 和 lock 2. 原理: synchronize:底层就是对象头存储锁信息,对象头包含三部分(Mark word 存储对象hashCode 和 锁记录、Class Meta space 存储对象类型的指针、Array Length 数组长度); lock:低层就是AQS,比较经典是ReentrantLock(可重入锁:当前线程获取锁后可重复加锁,加多少次就得解多少次),是一个FIFO先进先出队列,同时定义了同步状态来记录锁信息
编辑于 2024-02-22 17:21:06 回复(0)
m
发表于 2023-10-07 09:27:07 回复(0)
synchronized关键字和Lock synchronized:原理是Monitor+对象头,源码在jvm中,由c++代码实现,只有至多一个线程能获得锁,只有锁被释放其他线程才能获得,退出代码块自动释放锁,属于悲观锁 Lock:底层由AQS+CAS实现,是api接口,经典实现有ReentrantLock和ReentrantWriteLock,通过调用lock()和unlock()方法加锁解锁,支持可重入、公平锁和非公平锁
发表于 2023-08-22 17:18:21 回复(0)