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

标签 java multithreading synchronization

当 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/

相关文章:

java - 如何使用 Selenium 修复 Edge 浏览器中的 ElementNotVisibleException?

c++ - 如何退出后台线程循环?

java - 通过锁定在Java中实现线程安全的ArrayList

command-line - 命令行信号量实用程序

c# - 将数据从一个数据库(sql server 2008)传输到另一个具有不同模式的数据库(sql server 2008)的最佳方法

java - org.neo4j.ogm.exception.ServiceNotFoundException : Driver: org. neo4j.ogm.drivers.http.driver.HttpDriver

java - Selector.select(timeout) 在超时前返回 0

java - Spring 组件扫描不工作

java - spring @transactional 线程安全吗?

python - 拆分 Django 项目