2012-09-15 3 views
1

Этот код копируется из Интернета где-то:
Как это явное блокирование работает?Как узнать, успешно ли явная блокировка обеспечила видимость памяти?

public class Lock { 
    private Object lockObj = new Object(); 
    private Thread owner; 
    private int lockCount; 

    /** 
    * Waits for up to 'maxWait' milliseconds to acquire the lock, 
    * and returns true if the lock was acquired. 
    **/ 
    public boolean acquireLock(int maxWait) throws InterruptedException { 
    Thread currentThread = Thread.currentThread(); 
    synchronized (lockObj) { 
     if (owner == currentThread) { 
     lockCount++; 
     return true; 
     } 
     long waitedSoFar = 0L; 
     while (owner != null) { 
     long t0 = System.currentTimeMillis(); 
     long timeToWait = maxWait - waitedSoFar; 
     if (timeToWait <= 0) 
      return false; 
     lockObj.wait(timeToWait); 
     if (owner != null) { 
      waitedSoFar += System.currentTimeMillis() - t0; 
     } 
     } 
     owner = currentThread; 
     lockCount = 1; 
     return true; 
    } 
    } 
    public void releaseLock() { 
    Thread currentThread = Thread.currentThread(); 
    synchronized (lockObj) { 
     if (owner == currentThread) { 
     lockCount--; 
     if (lockCount == 0) { 
      owner = null; 
      lockObj.notify(); 
     } 
     return; 
     } else { 
     // Only the owner can release the lock! 
     throw new IllegalStateException(); 
     } 
    } 
    } 
} 

Я не видел никакого специального кода, чтобы гарантировать видимость памяти. Единственное, что связано с параллелизмом, - «синхронизировано» (lockObj) {...} "

Это волшебство?
Записывает ли процессор только весь свой кеш, прежде чем приобретать какой-либо монитор синхронизации?
Или наоборот?
Является ли процессор просто очищающим весь его кеш при выпуске какого-либо монитора синхронизации?

EDIT:
Ну, у меня есть что-то другое, связанное с параллелизмом wait/notify.

Подумайте об этом. Как работает эта явная блокировка?

  1. приобрести замок, изменить переменную (чтобы предотвратить ее получение другим потоком), затем отпустите замок.
  2. сделать все.
  3. получить замок, изменить переменную (чтобы разрешить другой поток приобретать ее).
  4. другой поток приобретает замок и петли ...

происходит, прежде, чем отношения только между 3 и 4 не так ли?
Или между 1 и 3 также есть гарантия, прежде чем отношения? Итак, 2 гарантирована видимость памяти?

+0

Когда синхронизированный метод завершается, он автоматически устанавливает связь между событиями и последующим вызовом синхронизированного метода для одного и того же объекта. Это гарантирует, что изменения состояния объекта будут видны для всех потоков. http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – nullpotent

+0

Это происходит, прежде чем между двумя блоками синхронизации. В случае явной блокировки, между блокировкой замка и блокировкой покупки. Не между фиксацией и выпуском. –

+0

у вас есть много вопросов о видимости памяти, но вы, кажется, не понимаете основы синхронизации Java? я бы рекомендовал сначала прочитать [java concurrency] (http://docs.oracle.com/javase/tutorial/essential/concurrency/), чтобы вы поняли основы, прежде чем задавать такие вопросы. – jtahlborn

ответ

1

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

Ответственность за эту блокировку отвечает java runtime и запрещает другому коду вводить синхронизированный блок кода. CPU просто видит инструкции, которые касаются этого.

Что касается вашего вопроса о кеше: процессор не просто решил сбросить кеш. Кэш остается на месте, пока он не будет перезаписан.

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