2015-12-31 2 views
3

Мне интересно вызвать полный забор памяти без использования sun.misc.Unsafe.Как вызвать полный забор памяти без использования sun.misc.Unsafe?

Выполняет ли следующий код Java полный забор памяти?

public final class Foo { 
    public void bar() { 
     // Before memory fence? 
     synchronized(this) { 
      // After memory fence? 
     } 
    } 
} 

ли следующий код Java также спускового полный забор памяти?

public final class Foo { 
    private final Object monitor = new Object(); 
    public void bar() { 
     // Before memory fence? 
     synchronized(monitor) { 
      // After memory fence? 
     } 
    } 
} 

ответ

1

Что вы пытаетесь достичь. Вы просто пытаетесь предотвратить переупорядочение своих операций «до» и «после»? Нужно ли вам, чтобы ваши операции были атомарными?

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

Другим способом запуска полного забора в java является запись в изменчивую переменную.

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