当 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 个请求完成为止。
有两种方法可以提高性能:
- 使
synchronized
block 内执行的操作尽可能快。 - 使用 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/