gpt4 book ai didi

java - 可重入锁和同步的实现有何不同

转载 作者:行者123 更新时间:2023-12-01 20:52:19 25 4
gpt4 key购买 nike

根据java源代码

ReentrantLock的锁(非公平)如下。

public boolean lock(){
int c=getState();
if(c==0){
compareAndSetState(0,1);
}
}
//getState method
public int getState(){
return state;
}
public boolean compareAndSetState(int expected,int update){
unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}

stateOffSet的值是state在内存中的偏移量(使用反射)。

从上面的代码中我可以理解的是,当我们调用lock.lock()时,内存中检查的state字段的第一个值,如果它为零,则仅将锁授予调用线程。

所以我的问题是当我们使用 Synchronized 关键字时会发生什么?在同步中是否也检查和设置锁定的某些字段?

还有一个疑问,我在某处读到可重入锁允许多个等待队列,这是什么意思?我们不是只有一个队列吗?

最佳答案

reentrant lock allows multiple wait queue,what does that mean?

这意味着您可以从一个 ReentrantLock 对象中获取多个 Condition 对象。当线程想要等待受锁保护的内容的原因有多个时,这一点很有用。

一个典型的例子是多生产者、多消费者队列。您可以使用一个条件供消费者用来等待队列变为非空,并使用另一条件供生产者用来等待队列变为非满。这就是一个优化。它确保生产者不会唤醒其他等待的生产者,消费者也不会唤醒其他等待的消费者。

如果使用 synchronized block 保护队列,则无法获得相同的优化,因为 o.wait() 方法无法让线程说出发生了什么事件它正在等待。

<小时/>

what happens when we usesynchronized key word

您唯一可以确定的是您在 Java 语言规范中读到的内容:不允许两个线程同时在同一对象上同步、内存可见性影响等。

至于它是如何实现的,...在不同的架构上,甚至在不同的操作系统上,这会有所不同。在最低级别,它可能将类似于ReentrantLock的工作方式,因为大多数硬件架构都提供了大约一种合理的方法来实现这一点。但是,synchronized 实现(如果有)和 ReentrantLock 实现使用的中级 API 和库的详细信息可能有所不同。唯一确定的方法是检查 JVM 和库源代码。

关于java - 可重入锁和同步的实现有何不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43030188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com