Java 多个线程到同一实例的同步方法
当1000个请求(每个Httprequest作为一个线程)到达调用Trust对象的deposit方法的服务器时会发生什么 我已经编写了这样的代码,工作得很好,但是如果存款金额有很长的逻辑,使得其他线程处于等待状态,情况会怎样呢Java 多个线程到同一实例的同步方法,java,multithreading,synchronization,Java,Multithreading,Synchronization,当1000个请求(每个Httprequest作为一个线程)到达调用Trust对象的deposit方法的服务器时会发生什么 我已经编写了这样的代码,工作得很好,但是如果存款金额有很长的逻辑,使得其他线程处于等待状态,情况会怎样呢 class Trust { private int amount; public synchronized void deposit(int amount) { this.amount += amount; System.o
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();
}
}
}
类信任{
私人整数金额;
公共同步作废存款(整笔金额){
此项。金额+=金额;
System.out.println(Thread.currentThread().getName()+“Amount”+this.Amount);
}
}
类DepositAmount实现Runnable{
信托obj;
私人整数金额;
存款金额(信托对象,整笔金额){
this.obj=obj;
此项。金额+=金额;
}
公开募捐{
目标存款(金额);
}
}
公共类银行{//CustomerToTrust{
公共静态void main(字符串参数[]){
System.out.println(“Naga”);
//nextInt金额(5000)
信任对象=新信任();
对于(int i=0;i<100;i++){
随机金额=新随机();
新线程(新存款金额(obj,100)).start();
}
}
}
在存款金额法逻辑较长的情况下,
请告诉我,假设一次有1000个请求将金额存入信托。
剩余的999个线程是否将被阻止,直到第一个线程的除臭量。最后一个线程如何,用户需要等到该时间才能响应。“剩余的999个线程是否将被阻止,直到第一个线程的除臭量”
是。第一个线程将进入存款方式。
要执行相同操作的任何其他线程都将进入阻塞状态,直到资源变为可用状态。“剩余的999个线程将被阻塞,直到第一个线程的deopists数量”
是。第一个线程将进入存款方式。
要执行相同操作的任何其他线程都将进入阻塞状态,直到资源变为可用状态。“剩余的999个线程将被阻塞,直到第一个线程的deopists数量”
是。第一个线程将进入存款方式。
要执行相同操作的任何其他线程都将进入阻塞状态,直到资源变为可用状态。“剩余的999个线程将被阻塞,直到第一个线程的deopists数量”
是。第一个线程将进入存款方式。
任何其他想要执行相同操作的线程都将进入阻塞状态,直到资源变为空闲状态。是的,所有其他使用信任同步“存款”方法的线程都必须等待第一个调用方在存款时完成其方法调用。 这对你的共享状态“信任”有点棘手
你应该有一个单独的线程…这个线程a.)让其他线程有机会添加“工作请求”(一个同步的方法,它只是把请求放在一个队列中)和一个在这个线程中处理这个队列的方法…这样你就可以将需要等待整个处理完成的过程解耦(因为线程只需要等待请求被放入队列中即可)。是的,所有其他使用信任同步“存款”方法的线程都必须等待第一个调用方在存款时完成其方法调用。 这对你的共享状态“信任”有点棘手
你应该有一个单独的线程…这个线程a.)让其他线程有机会添加“工作请求”(一个同步的方法,它只是把请求放在一个队列中)和一个在这个线程中处理这个队列的方法…这样你就可以将需要等待整个处理完成的过程解耦(因为线程只需要等待请求被放入队列中即可)。是的,所有其他使用信任同步“存款”方法的线程都必须等待第一个调用方在存款时完成其方法调用。 这对你的共享状态“信任”有点棘手
你应该有一个单独的线程…这个线程a.)让其他线程有机会添加“工作请求”(一个同步的方法,它只是把请求放在一个队列中)和一个在这个线程中处理这个队列的方法…这样你就可以将需要等待整个处理完成的过程解耦(因为线程只需要等待请求被放入队列中即可)。是的,所有其他使用信任同步“存款”方法的线程都必须等待第一个调用方在存款时完成其方法调用。 这对你的共享状态“信任”有点棘手
你应该有一个单独的线程…这个线程a.)让其他线程有机会添加“工作请求”(一个同步的方法,它只是把请求放在一个队列中)和一个在这个线程中处理这个队列的方法…这样你就可以将需要等待整个处理完成的过程解耦(因为线程只需等待请求被放入队列即可)。线程将一次调用一个
deposit()
。因此,第1000个请求将被阻止,直到其他999个请求完成为止
有两种方法可以提高性能:
同步块内执行的操作尽可能快
另请参见。线程将一次调用一个
存款()
。因此,第1000个请求将被阻止,直到其他999个请求完成
有两种方法可以提高性能:
同步块内执行的操作尽可能快
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);
}
}