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()
,该计划将需要更多时间才能完成。
答案 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)
您还可以检查上述每种情况下的时差,以便针对不同情况执行相同的代码。