gpt4 book ai didi

java - java中的同步块(synchronized block)

转载 作者:行者123 更新时间:2023-12-02 04:29:14 25 4
gpt4 key购买 nike

class Call {
int count;

public void increment() {
for (int i = 0; i < 1000; i++)
count++;
}
}

class Caller implements Runnable {

Call c;

public Caller(Call c) {
this.c = c;
}

@Override
public void run() {
// TODO Auto-generated method stub
c.increment();
}
}

class Calling implements Runnable {

Call c;

public Calling(Call c) {
this.c = c;
}

@Override
public void run() {
// TODO Auto-generated method stub
synchronized (c) {
c.increment();
}
}
}

public class SynchronizedBlock {

public static void main(String[] args) throws InterruptedException {
Call call = new Call();
Calling calling = new Calling(call);
Caller caller = new Caller(call);

Thread t1 = new Thread(caller);

Thread t2 = new Thread(calling);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("caller:" + caller.c.count);
}
}

这里已经在 1 个类中同步了增量方法,而在其他类中我还没有将其同步。当我运行上面的代码时,它有时会给出小于 2000 的计数值。

据我了解,由于Calling类的对象已经锁定了对象,所以不需要在Caller类的increment方法中进行同步。

您能帮我理解这里的逻辑吗?

最佳答案

Since Calling class's object has already locked the object, so there is no need to synchronize in Caller class increment method.

你的理解是错误的。为了使变量上的并行操作具有确定性,您必须在对该变量的每次访问/修改**进行某种同步。

您还需要在Caller中进行同步

**:这是保证确定性的必要但不充分的条件。

关于java - java中的同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31709510/

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