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

时间:2015-01-16 11:19:57

标签: java multithreading synchronization

当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数量为止。最后一个线程怎么样,用户需要等到那个时间才能响应。

3 个答案:

答案 0 :(得分:1)

“剩余的999个线程是否会被阻塞,直到第一个线程反复数据显示”

是。第一个线程将进入存款方式。 任何其他想要执行相同操作的线程都将进入阻塞状态,直到资源空闲为止。

答案 1 :(得分:1)

是的,所有其他线程使用synchronized&#34; deposit&#34; Trust上的方法必须等待第一个调用者完成它的存款方法调用。 这对你的共享状态来说有点棘手&#34;信任&#34; ...

你应该有一个单独的线程...这个线程a。)让其他线程有机会添加&#34;请求工作&#34; (一个同步的方法,只是将请求放入队列中)和此线程中的一个方法在该队列上工作...这样就可以解耦需要等待整个处理完成的过程(因为线程)只需等待请求被放入队列。)

答案 2 :(得分:1)

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

有两种方法可以提高效果:

  1. 尽快在synchronized块内执行操作。
  2. 使用non-blocking algorithm
  3. 后者可以使用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