2014-11-25 2 views
0

Я относительно новичок в параллелизме. Я занимаюсь параллелизмом с сайта Oracle. Я stucked в следующем примере: -Как этот замок полезен в любом случае?

public class MsLunch { 
    private long c1 = 0; 
    private long c2 = 0; 
    private Object lock1 = new Object(); 
    private Object lock2 = new Object(); 

    public void inc1() { 
     synchronized(lock1) { 
      c1++; 
     } 
    } 

    public void inc2() { 
     synchronized(lock2) { 
      c2++; 
     } 
    } 
} 

Я хочу знать, как этот тип блокировки полезен над использованием синхронизирована (это) тип блокировки? И в каких ситуациях этот тип блокировки предпочтительнее?

Благодаря

ответ

4

Это полезно, когда у вас есть один объект, для которого требуется более точное разрешение исключения, чем сам объект. Другими словами, объект с несколькими ресурсами, которые необходимо защищать, но не обязательно друг от друга.

скупаются в мире PThreads, это легко понять, поскольку мьютекс и он защищен ресурс, как правило, всегда развязаны - никогда не было этой удобной стенографии найти в Java для использования объекта в качестве замка.

В качестве примера предположим, что каждый объект имеет массив из тысячи целых чисел, и вы хотите заблокировать группу из ста за раз (0xx, 1xx и т. Д.) Для максимального параллелизма.

В этом случае вы создаете десять объектов, по одному на группу из ста, и вы можете заблокировать отдельных частей массива. Таким образом, если у вас есть поток, играющий с блоками 0xx и 4xx, он не остановит другой поток от входа и что-то сделает с блоком 7xx.

Теперь это довольно надуманный пример, но понятие иногда появляется в реальности.

В конкретном примере, вы дали, только один поток одновременно может прийти и увеличивает c1 одновременно, но замок на lock1 еще позволяет другой поток прийти и изменить c2.

С блокировкой объекта (this), параллельность будет уменьшена, потому что c1 и c2 не могут обновляться одновременно, несмотря на то, что конфликта нет.

+0

@paxidiablo, спасибо, сэр за четкое объяснение :) – Ankit

1

замок Объект не что иное, как вы блокировка критической секции явно объекта. synchronized (this) описывает, что вы блокируете критический раздел текущим объектом.

1

Наличие двух отдельных замков для inc1 и inc2 полезен в ситуациях, когда вы хотите, чтобы убедиться, что нет двух параллельных потоков не может одновременно вызвать тот же самый метод, в то же время, но где вы сделать хотите, чтобы два параллельных потоков для вызова разных методов на одном и том же объекте.

В вашем примере, если поток 1 вызывает inc1, поток 2 заблокирован от вызова inc1 до тех пор, пока не будет выполнена нить 1. Тем не менее, поток 2 можно позвонить по телефону inc2.

Смежные вопросы