gpt4 book ai didi

Java同步块(synchronized block)——锁定对象

转载 作者:行者123 更新时间:2023-12-01 08:10:03 25 4
gpt4 key购买 nike

在示例代码中

public class MsLunch {
private long c1 = 0;
private long c2 = 0;
private Object lock1 = new Object();
private Object lock2 = new Object();

public void inc1() {
synchronized(lock1) {
c1++;
}
}

public void inc2() {
synchronized(lock2) {
c2++;
}
}
}

关于 this页面,

lock1lock2 控制 c1c2 回复的更新。

但是,

    synchronized(lock2) 

正在获取对象lock1的锁,并在synchronized block 时释放它

    synchronized(lock1) {
c1++;
}

被执行。

当这个 block 正在执行时,可能会有this 对象的成员 c1 的更新仍然存在——但我不知道看看这个更新是如何被阻止的如代码中所示,在 lock1 上同步。

它是对象lock1,具有独占访问权--没有别的(?)

那么,实现得如何

public void inc1() {
synchronized(lock1) {
c1++;
}
}

与上面的代码不同

public void synchronized inc1() {
c1++;
}

甚至

public void inc1() {
synchronized(c1) {
//do something on c1
}
}

c1是对象而不是基元时?

我在这里缺少什么?

注:我看到

What is the difference between synchronized on lockObject and using this as the lock?

Java synchronized method lock on object, or method?

以及其他一些讨论。

最佳答案

实现1。

您正在锁定 lock1 对象。需要锁定 lock1 的任何其他操作都无法执行。让两个方法锁定不同的对象意味着这两个方法可以并发运行,但两个线程不能同时运行同一个方法。

实现2。

使方法同步意味着整个方法体隐式地位于synchronized(this) block 中(或者在Class对象上同步)如果方法是静态。如果两个方法都是同步,那么一个方法将阻止另一个方法同时运行,这与将两个方法锁定在不同的对象上是不同的.

实现3.

如果 c1 是一个对象而不是原语,则语义与实现 1 非常相似 - 锁定显式对象。

关于Java同步块(synchronized block)——锁定对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18156954/

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