gpt4 book ai didi

java - 更多线程同步同一实例的方法

转载 作者:行者123 更新时间:2023-12-01 22:30:07 25 4
gpt4 key购买 nike

当 1000 个请求(每个 Httprequest 作为一个线程)到达调用 Trust 对象的 Deposit 方法的服务器时会发生什么。

我已经编写了这样的代码,效果很好,但是如果存款金额有很长的逻辑,导致其他线程处于等待状态,情况会怎样。

class Trust {
private int amount;
public synchronized void deposit(int amount) {
this.amount += amount;
System.out.println(Thread.currentThread().getName() + "; Amount " +this.amount);
}
}

class DepositAmount implements Runnable {
Trust obj;
private int amount;

DepositAmount(Trust obj, int amount) {
this.obj = obj;
this.amount += amount;
}
public void run() {
obj.deposit(amount);
}
}

public class Bank {//CustomerToTrust {
public static void main(String args[]) {
System.out.println("Naga");
//amt.nextInt(5000)
Trust obj = new Trust();
for(int i =0; i< 100 ; i++) {
Random amt = new Random();
new Thread(new DepositAmount(obj, 100)).start();
}
}
}

如果存款金额方法逻辑很长,请告诉我,假设一次收到 1000 个将金额存入信托的请求。剩余的 999 个线程将被阻塞,直到第一个线程 deopists 数量为止。最后一个线程呢,用户需要等到那个时候才能得到响应。

最佳答案

线程将一次调用一个deposit()。因此,第 1000 个请求将被阻塞,直到其他 999 个请求完成为止。

有两种方法可以提高性能:

  1. 使synchronized block 内执行的操作尽可能快。
  2. 使用 non-blocking algorithm .

后者可以使用 AtomicInteger 来实现:

class Trust {
private AtomicInteger balance = new AtomicInteger(0);
public void deposit(int amount) {
int newBalance = this.balance.addAndGet(amount);
System.out.println(Thread.currentThread().getName() +
"; Balance " + newBalance);
}
}

请注意,即使此实现在更新帐户方面是正确的,但输出字符串可能会乱序打印。

另请参阅Amdahl's Law .

关于java - 更多线程同步同一实例的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27982859/

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