Оба 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 по ссылке или по значению?
Разница между синхронизированными и блокировками чтения / записи такова, что когда вы используете синхронизированный режим, он допускает доступ только к одному потоку за раз. С блокировкой чтения / записи у вас может быть много считывателей одновременно (учитывая, что блокировок записи уже нет), поэтому вы можете получить лучшую параллельную производительность в некоторых случаях, особенно когда здесь много операций чтения.
Вы должны добавить еще много потоков, которые обращаются к этому объекту, чтобы проверить производительность.
И вы можете просто посчитать время между завершением и началом операций, чтобы измерить производительность (например, 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;
}
}