2014-01-07 7 views
2

Вопрос возникает после прочтения this one. В чем разница между синхронизированными и несинхронизированными объектами? Почему Unsynchronized Objects работают лучше, чем Synchronized?Почему несинхронизированные объекты работают лучше, чем синхронизированные?

+0

только один поток может одновременно использовать синхронизированный объект, таким образом, другие потоки должны ждать .. – ogzd

+1

плюс есть затраты, связанные с запорным механизмом, так что даже с одним потоком это медленнее, если синхронизация происходит. –

ответ

5

В чем разница между синхронизированными и несинхронизированными объектами? Почему Unsynchronized Objects работают лучше, чем Synchronized?

HashTable считается синхронизированы, поскольку его методы помечены как synchronized. Всякий раз, когда нить входит в метод synchronized или блок synchronized, он должен сначала получить эксклюзивный контроль над монитором, связанным с синхронизируемым экземпляром объекта. Если другой поток уже находится в блоке synchronized на одном и том же объекте, тогда это приведет к блокировке потока, который является штрафом за производительность, как упомянули другие.

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

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

В качестве альтернативы, HashTable - это более старый класс. Если вам нужен реентер Map, то следует использовать ConcurrentHashMap.

2

Популярный говорящий синхронный объект - это модель одного потока, если есть 2 потока, которые хотят изменить синхронизированный объект. если первый получает блокировку объекта, последний должен быть waite.but, если объект несинхронизирован, они могут работать с объектом одновременно, поэтому причина, по которой Unsynchronized является небезопасной.

+0

Спасибо, друг. простой вопрос, который я задал .. :( – UnderDog

+0

FYI: В «синхронизированных» блоках есть другие последствия для производительности. Я обратился к ним в своем ответе. – Gray

2

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

Точные механизмы блокировки в игре, когда синхронизация происходит которые объясняют в How the Java virtual machine performs thread synchronization

0

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

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

Наконец, я хотел бы добавить короткое предупреждение: одновременное программирование с использованием синхронизации - hard. Я обнаружил, что обычно другие элементы управления параллелизмом лучше подходят для моих потребностей. Один из моих фаворитов - Atomic Reference. Эта утилита великолепна, потому что она очень ограничивает количество синхронизированного кода. Это упрощает чтение, поддержку и запись.

0

Синхронизация:

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

в то время как вектор синхронизируется. Это означает, что если один поток работает с Vector, ни одна другая нить не может его удержать. В отличие от Array List, только один поток может выполнять операцию по вектору за раз.

Производительность:

синхронные операции потребляет больше времени по сравнению с несинхронизированных из них, так что если нет необходимости в потокобезопасную операции, список Массива является лучшим выбором, поскольку производительность будет улучшен из-за одновременных процессов.

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