Что означает «синхронизированный»?

$arraySize = count($results);
for($i=0; $i<$arraySize; $i++)
{
  $comma = ($i<$arraySize) ? ", " : "";
  echo $results[$i]->name.$comma;
}
925
задан user207421 26 January 2016 в 23:14
поделиться

5 ответов

Ключевое слово synchronized предназначено для чтения и записи разными потоками одних и тех же переменных, объектов и ресурсов. Это нетривиальная тема в Java, но вот цитата из Sun:

синхронизированные методы позволяют стратегия предотвращения потока помехи и непротиворечивость памяти ошибки: если объект виден более одного потока, все читает или записи в переменные этого объекта done through synchronized methods.

In a very, very small nutshell: When you have two threads that are reading and writing to the same 'resource', say a variable named foo, you need to ensure that these threads access the variable in an atomic way. Without the synchronized keyword, your thread 1 may not see the change thread 2 made to foo, or worse, it may only be half changed. This would not be what you logically expect.

Again, this is a non-trivial topic in Java. To learn more, explore topics here on SO and the Interwebs about:

Keep exploring these topics until the name "Brian Goetz" becomes permanently associated with the term "concurrency" in your brain.

860
ответ дан 19 December 2019 в 20:21
поделиться

Мне нравится , объяснение Jenkov

синхронизировалось

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

происходит - прежде <глоток> [О]

разблокировать (синхронизировал блок, или выход метода) монитора happens-before каждая последующая блокировка (синхронизировал блок или запись метода) того же самого монитора.

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

От Java 5

Java Concurrency Utilities

синхронизируемый механизм был первым механизмом Java для синхронизации доступа к объектам, совместно использованным несколькими потоками. Синхронизируемый механизм не очень усовершенствован все же. Именно поэтому Java 5 заставил полный набор concurrency utility классы помогать разработчикам реализовать более мелкомодульное управление совместным выполнением, чем, что Вы получаете с синхронизируемым.

0
ответ дан yoAlex5 4 October 2019 в 08:12
поделиться

Насколько я понимаю, синхронизация в основном означает, что компилятор записывает monitor.enter и monitor.exit вокруг вашего метода. Таким образом, он может быть потокобезопасным в зависимости от того, как он используется (я имею в виду, что вы можете написать объект с синхронизированными методами, который не является потокобезопасным, в зависимости от того, что делает ваш класс).

10
ответ дан 19 December 2019 в 20:21
поделиться

Думайте об этом как о турникете, который можно найти на футбольном поле. Идут параллельные пары желающих попасть, но у турникета они «синхронизированы». Только один человек может пройти. Все, кто хочет пройти, подойдут, но им, возможно, придется подождать, пока они смогут пройти.

21
ответ дан 19 December 2019 в 20:21
поделиться

The synchronized keyword causes a thread to obtain a lock when entering the method, so that only one thread can execute the method at the same time (for the given object instance, unless it is a static method).

This is frequently called making the class thread-safe, but I would say this is a euphemism. While it is true that synchronization protects the internal state of the Vector from getting corrupted, this does not usually help the user of Vector much.

Consider this:

 if (vector.isEmpty()){
     vector.add(data);
 }

Even though the methods involved are synchronized, because they are being locked and unlocked individually, two unfortunately timed threads can create a vector with two elements.

So in effect, you have to synchronize in your application code as well.

Because method-level synchronization is a) expensive when you don't need it and b) insufficient when you need synchronization, there are now un-synchronized replacements (ArrayList in the case of Vector).

More recently, the concurrency package has been released, with a number of clever utilities that take care of multi-threading issues.

53
ответ дан 19 December 2019 в 20:21
поделиться
Другие вопросы по тегам:

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