繁体   English   中英

更多线程可以同步同一实例的方法

[英]More threads to synchronized method of same instance

当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个线程是否会被阻塞,直到第一个线程不再使用该线程。 关于最后一个线程,用户需要等到那个时间才能得到响应。

“剩余的999个线程将被阻塞,直到第一个线程的操作员数量达到为止”

是。 第一个线程将进入存款方法。 任何其他想要执行此操作的线程都将进入阻塞状态,直到资源可用。

是的,在Trust上使用同步的“ deposit”方法的所有其他线程必须等待第一个调用方完成其对存款的方法调用。 与您的共享状态“信任”有点棘手...

您应该有一个单独的线程...该线程a。)使其他线程有机会添加“工作请求”(同步方法,该方法将请求放入队列中),并且该线程中的方法可以对该队列进行工作...这样一来,您便可以将需要等待整个处理完成的过程分离开来(因为线程只需要等待,直到将请求放入队列中即可)。

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

有两种提高性能的方法:

  1. 使在synchronized块内执行的操作尽可能快。
  2. 使用非阻塞算法

后者可以使用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);
    }
}

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

另请参阅阿姆达尔定律

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM