Этот код копируется из Интернета где-то:
Как это явное блокирование работает?Как узнать, успешно ли явная блокировка обеспечила видимость памяти?
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.
Подумайте об этом. Как работает эта явная блокировка?
- приобрести замок, изменить переменную (чтобы предотвратить ее получение другим потоком), затем отпустите замок.
- сделать все.
- получить замок, изменить переменную (чтобы разрешить другой поток приобретать ее).
- другой поток приобретает замок и петли ...
происходит, прежде, чем отношения только между 3 и 4 не так ли?
Или между 1 и 3 также есть гарантия, прежде чем отношения? Итак, 2 гарантирована видимость памяти?
Когда синхронизированный метод завершается, он автоматически устанавливает связь между событиями и последующим вызовом синхронизированного метода для одного и того же объекта. Это гарантирует, что изменения состояния объекта будут видны для всех потоков. http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – nullpotent
Это происходит, прежде чем между двумя блоками синхронизации. В случае явной блокировки, между блокировкой замка и блокировкой покупки. Не между фиксацией и выпуском. –
у вас есть много вопросов о видимости памяти, но вы, кажется, не понимаете основы синхронизации Java? я бы рекомендовал сначала прочитать [java concurrency] (http://docs.oracle.com/javase/tutorial/essential/concurrency/), чтобы вы поняли основы, прежде чем задавать такие вопросы. – jtahlborn