Синхронизация всего объекта и синхронизация конкретного поля объекта - это лучший подход. - PullRequest
0 голосов
/ 25 мая 2020

Работая над проблемой «Производитель-потребитель», я наткнулся на сценарий, в котором я могу синхронизировать поле «sharedLinkedList» или весь объект «this» класса «SharedObject». sharedLinkedList - это поле, над которым будут работать потоки Producer и Consumer.

Найдите фрагмент класса с методом Produce: -

 public class SharedObject {
        LinkedList<Integer> sharedLinkedList = new LinkedList<Integer>();
        int capacity = 5;


        public void produce() {
            while (true) {
                synchronized (sharedLinkedList) {// Alternately synchronized(this)

                    try {
                        while(sharedLinkedList.size() == capacity){

                            sharedLinkedList.wait();//Alternately this.wait()
                        }
                    } catch (InterruptedException e) {

                        e.printStackTrace();
                    }

                    sharedLinkedList.add(123);
                    sharedLinkedList.notify();//Alternately this.notify
                }
            }
        }
    }

Оба подхода работают.

1. Синхронизация по полю "sharedLinkedList" 2. Синхронизация всего объекта (укажите в качестве комментария во фрагменте кода).

Какой подход лучше и почему?

1 Ответ

1 голос
/ 25 мая 2020

С указанным объемом кода оба подхода эквивалентны. Это не означает, что они эквивалентны при всех обстоятельствах.

synchronized(x) устанавливает блокировку на x, поэтому в целом вы должны синхронизировать, используя объект, общий для всех потоков, использующих общие ресурсы. Если потоки используют один общий ресурс (например, список), то синхронизация по этому списку работает. Если потоки совместно используют более одного ресурса, вам необходимо выполнить синхронизацию на отдельном объекте, чтобы контролировать доступ к этим общим ресурсам. Это может быть объект или this в зависимости от контекста.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...