gpt4 book ai didi

Java同步函数工作而同步块(synchronized block)不工作

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

takeAmount和addAmount只是从balanceAccount中添加/减去值(例如添加11,12...,20或添加101,102...,110)。 BalanceAccount有两个版本,一个是使用同步函数,另一个是使用同步块(synchronized block)。

BalanceAccount_synchronizedBlock 和 BalanceAccount_synchronizedFunction 之间有什么不同吗?

事实上,BalanceAccount_synchronizedFunction 始终返回 0,而 BalanceAccount_synchronizedBlock 则不会。

而且......为什么它会表现出不同的行为?

public class mainStart {
public static void main(String args[])
{
for (int i=1;i<3000;i=i+10)
{
new Thread(new addAmount(i)).start();
new Thread(new takeAmount(i)).start();
}

try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//BalanceAccount_synchronizedBlock.printAmount();
BalanceAccount_synchronizedFunction.printAmount();
}


}

class takeAmount implements Runnable {
private int startFrom;

public takeAmount(int start)
{
this.startFrom=start;
}

public void run()
{
for (int i=startFrom;i<startFrom+10;i++)
//BalanceAccount_synchronizedBlock.sub(i);
BalanceAccount_synchronizedFunction.sub(i);
}

}

class addAmount implements Runnable {
private int startFrom;

public addAmount(int start)
{
this.startFrom=start;
}

public void run()
{
for (int i=startFrom;i<startFrom+10;i++)
//BalanceAccount_synchronizedBlock.add(i);
BalanceAccount_synchronizedFunction.add(i);
}

}

public class BalanceAccount_synchronizedBlock {
public static Integer amount=0;

public static void add(int a)
{
synchronized (amount)
{
amount = amount + a;
}
}

public static void sub(int a)
{
synchronized (amount)
{
amount = amount - a;
}
}

public synchronized static void printAmount()
{
System.out.println("Amount " + amount);
}

}

public class BalanceAccount_synchronizedFunction {
public static Integer amount=0;

public synchronized static void add(int a)
{
amount = amount + a;
}

public synchronized static void sub(int a)
{
amount = amount - a;
}

public synchronized static void printAmount()
{
System.out.println("Amount " + amount);
}

}

最佳答案

同步方法使用封闭类作为同步 token 。当您编写 synchronized(amount) 时,您正在使用 Integer 实例作为同步 token 。由于在这两种情况下您没有使用相同的 token ,因此锁定不会按预期发生。

另请注意,Integer 是不可变的,每次将值重新分配给 amount 时,您都会创建一个新实例,并且会丢失该实例上可能拥有的任何锁定。之前的值。

关于Java同步函数工作而同步块(synchronized block)不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32265818/

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