多个锁如何加速多线程代码?

时间:2015-02-03 17:26:36

标签: java multithreading

synchronized语句与同步方法相比如何加快代码的速度?

 public void stageOne() {

    synchronized (lock1) {
        list1.add(random.nextInt(100));
    }
}

public void stageTwo() {

     synchronized (lock2) {
        list2.add(random.nextInt(100));
    }
}
public void process() {
    for (int i = 0; i < 1000; i++) {
        stageOne();
        stageTwo();
    }
}


    Thread t1 = new Thread(new Runnable() {
        public void run() {
            process();
        }
    });

    Thread t2 = new Thread(new Runnable() {
        public void run() {
            process();
        }
    });

如果我使用public synchronized void stageOne()public synchronized void stageTwo(),该计划将需要更多时间才能完成。

3 个答案:

答案 0 :(得分:3)

如果stageOne()stageTwo()被声明为synchronized,他们将使用相同的锁定。该锁定将是包含这些方法的对象。这意味着这些方法不能同时执行。

由于您有两个方法和两个线程,因此您将有四种方法竞争同一个锁。如果两个方法都有自己的锁,就像在您提供的代码中一样,每个方法的一个实例可以同时执行。

答案 1 :(得分:0)

假设每个阶段需要1秒才能执行,并且您启动2个线程。

使用全局锁定,如果一个线程执行任何方法,则另一个线程无法执行任何方法。所以总时间为2秒+2秒= 4秒。

T1
S1 ---- S2 --- end

T2
wait----------- S1 ---- S2 ---- end

使用2个锁,一旦第一个线程完成执行stage1,第二个线程可以执行stage1,而第一个执行stage2。因此,假设任务完全可并行化并且您有2个核心,则第二个线程将等待1秒,然后执行其两个阶段,因此总时间将为3秒。

T1
S1 ---- S2 --- end

T2
wait--- S1 ----S2 ---- end

答案 2 :(得分:0)

Syncronized方法锁定整个方法。因此只有一个线程可以执行该方法,导致其他线程等待。

Syncronized语句锁定块而不是方法,因此与Syncronized方法相比它更快。

示例1(同步方法):假设有a public toilet。有2 person,他们都必须pee(尽可能快)但只有一个人可以进入厕所,当它进入厕所时locks。在这种情况下,Person 2必须waits在门外Person 1释放厕所。所以同样在Syncronized method线程2的情况下,在线程1的方法之外等待释放锁。Syncronized method Demo(8028 ms)

示例2(同步块):假设有a public toilet。有2 person,他们都必须pee(尽可能快)但是在这种情况下他们都可以enter在厕所里但是当他们进入时他们发现厕所里只有one urinal。但是在这种情况下,Person 2正在厕所门内等待Person 1释放小便池。在门外或内部等待并没有太大区别但是有一个difference(maybe for few seconds)。如果Syncronized block线程2在函数内部等待,则相同但是在块的外部,线程1释放锁。因此同步块比同步方法花费的时间更少。Syncronized block with one lock(4252 ms)

real advantage正在使用2或more locks用于不同的线程,例如在第二个示例中当2个人进入厕所时,他们发现2 urinals他们都可以同时使用不同的小便池。函数2和后来的函数thread 1 holds lock 1 for functionn 1 and at the same time thread 2 holds lock 2相同,当它们是空闲时。这可能会节省更多时间。Syncronized block with 2 locks(2138 ms)

您还可以检查上述每种情况下的时差,以便针对不同情况执行相同的代码。