Разница между блокировками чтения / записи и синхронизированными показана в базовом коде

Оба a и b содержат ссылку на один и тот же объект массива в памяти. Чтобы сохранить исходный массив в b, вам нужно будет скопировать массив.

a = [1,2,3,4] # => [1, 2, 3, 4]
b = a         # => [1, 2, 3, 4]
c = a.dup     # => [1, 2, 3, 4]
a.push 5      # => [1, 2, 3, 4, 5]
a             # => [1, 2, 3, 4, 5]
b             # => [1, 2, 3, 4, 5]
c             # => [1, 2, 3, 4]

Для получения дополнительной информации о том, почему это происходит, прочитайте . Проходит ли Ruby по ссылке или по значению?

0
задан c0der 19 January 2019 в 14:10
поделиться

1 ответ

Разница между синхронизированными и блокировками чтения / записи такова, что когда вы используете синхронизированный режим, он допускает доступ только к одному потоку за раз. С блокировкой чтения / записи у вас может быть много считывателей одновременно (учитывая, что блокировок записи уже нет), поэтому вы можете получить лучшую параллельную производительность в некоторых случаях, особенно когда здесь много операций чтения.

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

И вы можете просто посчитать время между завершением и началом операций, чтобы измерить производительность (например, Long startTime = System.nanoTime ();).

Прочтите здесь, чтобы узнать, как проверить, закончился ли поток, чтобы можно было измерить время выполнения: Как узнать, закончили ли другие потоки?


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

очень простой пример согласно вашему существующий класс:

class Number {

    private int value;

    public Number(int value) {
        this.value = value;
    }

    public synchronized int getValue() {
        return value;
    }

    public synchronized int changeData(int change) {
        value = change;
        return value;
    }
}
0
ответ дан ejaksla 19 January 2019 в 14:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: