当1000个请求(每个Httprequest作为一个线程)进入调用Trust对象的存入方法的服务器时会发生什么。
我编写了这样的代码,但是工作正常,但是如果存款金额有很长的逻辑使得其他线程处于等待状态,那么情况如何。
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数量为止。最后一个线程怎么样,用户需要等到那个时间才能响应。
答案 0 :(得分:1)
“剩余的999个线程是否会被阻塞,直到第一个线程反复数据显示”
是。第一个线程将进入存款方式。 任何其他想要执行相同操作的线程都将进入阻塞状态,直到资源空闲为止。
答案 1 :(得分:1)
是的,所有其他线程使用synchronized&#34; deposit&#34; Trust上的方法必须等待第一个调用者完成它的存款方法调用。 这对你的共享状态来说有点棘手&#34;信任&#34; ...
你应该有一个单独的线程...这个线程a。)让其他线程有机会添加&#34;请求工作&#34; (一个同步的方法,只是将请求放入队列中)和此线程中的一个方法在该队列上工作...这样就可以解耦需要等待整个处理完成的过程(因为线程)只需等待请求被放入队列。)
答案 2 :(得分:1)
线程将一次调用deposit()
个。因此,第1000个请求将被阻止,直到其他999完成。
有两种方法可以提高效果:
synchronized
块内执行操作。后者可以使用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。