Есть ли разные уровни синхронизации? - PullRequest
1 голос
/ 20 января 2010

Я слышал, что есть разные уровни синхронизации. (Если есть, не могли бы вы объяснить их с помощью фрагмента кода?) Спасибо.

Ответы [ 3 ]

3 голосов
/ 20 января 2010

Вам действительно нужно объяснить, что вы имели в виду под "уровнем синхронизации".Вы говорите о разнице между:

public synchronized void foo()
{
    ...
}

и

public void foo()
{
    synchronized(lock)
    {
        ...
    }
}

?Или, возможно, между вышеупомянутым и использованием блокировок из java.util.concurrent.locks ?

Если бы вы могли дать больше контекста тому, что вы слышали, мы можем помочь вамлучше.Что еще более важно, какую проблему вы пытаетесь решить, которая, по вашему мнению, может нуждаться в этой информации?

3 голосов
/ 20 января 2010

До Java 5 было только одно: ключевое слово synchronized.Это ожидало и получило эксклюзивную блокировку эталонного объекта.При применении к функции:

public synchronized void doStuff() { ... }

синхронизируемый объект имеет вид this.

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

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

0 голосов
/ 07 июня 2015

Я предполагаю, что OP имеет в виду синхронизацию объекта, используемого в многопоточности, а не ключевое слово в Java.

Это мое понимание после прочтения Гетца различных уровней синхронизации в Java.

Предположим, у нас есть объект, который мы должны использовать в 132 потоках, которые используют объект непрерывно, чисто случайным образом, скажем, в течение 100 лет.

abstract Class ICount {
int i;
String iString;
public void add(int i);
public void sub(int i);
public void synchronized print(){
  assert(i == Integer.valueOf(iString));
  System.out.println("i"+String.valueof(i)+" == "+iString);
   }
}

Теперь могут быть разные реализации, которые либо по замыслу, либо по неосторожности могут быть поточно-ориентированными на разных уровнях.

  1. Реализация безопасной потоковой синхронизации: Гарантирует, что любой java-код, который не использует отражение, чтобы прикрутить объект, используя эту реализацию, никогда не попадет в assert.
  2. Параллельная реализация синхронизации: Помимо обеспечения безопасности потоков, автор этой реализации попытался разрешить параллельные выполнения, когда это было возможно, а также сделал попытку избежать блокировок (конфликтов).
  3. Реализация небезопасной синхронизации потоков: Разработчик этого, по крайней мере, знает, что его класс не является потокобезопасным, и просит вас не использовать эту реализацию, если у вас нет только одного потока.

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

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