gpt4 book ai didi

java - 类有 2 个同步方法。当一个线程在第二个方法中时,另一个线程可以进入第一个方法吗?

转载 作者:行者123 更新时间:2023-11-30 06:16:59 24 4
gpt4 key购买 nike

我知道之前有人问过“Do two synchronized methods execute simultaneously”这个问题,给出的答案是“No. 只有一个线程可以持有对象的锁。然后只有那个线程可以进入同步方法在那个物体上。”但是,如果它是真的,那么请帮助我理解以下代码的输出:

public class SynchronizationMistake {

public int count;

public synchronized int getCount()
{
return count;
}
public synchronized String incrementCount()
{
count++;
return"";
}

public static void main (String args[])
{
SynchronizationMistake syn = new SynchronizationMistake();
Thread first = new Thread(syn.new readIncrementCount(syn),"First");
Thread second = new Thread(syn.new readIncrementCount(syn), "Second");
Thread third = new Thread(syn.new readIncrementCount(syn), "Third");

first.start();
second.start();
third.start();

}
private class readIncrementCount implements Runnable
{

SynchronizationMistake syn;
readIncrementCount(SynchronizationMistake syn)
{
this.syn = syn;
}
@Override
public void run() {

System.out.println("I am "+Thread.currentThread().getName()+".Count is "+ syn.getCount());
System.out.println("I am "+Thread.currentThread().getName()+".Incrementing count now"+syn.incrementCount());
System.out.println("I am "+Thread.currentThread().getName()+". After Increment Count is "+ syn.getCount());


}

}

Output is :
I am First.Count is 0
I am First.Incrementing count now
I am First. After Increment Count is 1
I am Third.Count is 0
I am Second.Count is 0
I am Third.Incrementing count now
I am Second.Incrementing count now
I am Third. After Increment Count is 3
I am Second. After Increment Count is 3

每次我运行这个程序时输出都不同。我的疑问是,当第二个/第三个线程获得 CPU 时,为什么它没有将“计数”读为 1(由第一个线程更新)?换句话说,当第一个线程锁定“syn”并将计数更新为 1 时,第二个/第三个线程如何设法进入“getCount”方法。

最佳答案

语句System.out.println("I am "+Thread.currentThread().getName()+".Count is "+ syn.getCount());没有执行一种原子方式。 syn.getCount() 部分可以在 println 之前执行。这似乎也发生在您的示例中。所有线程都先做syn.getCount(),此时计数还是0,然后才执行剩下的。

关于java - 类有 2 个同步方法。当一个线程在第二个方法中时,另一个线程可以进入第一个方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26436899/

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