Небезопасная реализация класса Sun - PullRequest
5 голосов
/ 31 марта 2012
/**
     * Atomically update Java variable to <tt>x</tt> if it is currently
     * holding <tt>expected</tt>.
     * @return <tt>true</tt> if successful
     */
    public final native boolean compareAndSwapObject(Object o, long offset,
                                                     Object expected,
                                                     Object x);

1) Как они «атомарно» устанавливают значение «o» в позиции «offset» на «x», если «value == ожидается»?

2) Как они «блокируют» объект, когда мы используем синхронизированный метод или синхронизированный блок? Мне просто любопытно узнать, что скрывается под капотом.

Ответы [ 4 ]

4 голосов
/ 31 марта 2012
  1. Поскольку это нативный метод, они будут прибегать к тому, что предлагает целевая платформа.IIRC, «сравнить и поменять», присутствовал на MIPS и SPARC в качестве команды процессора более 10 лет назад.

  2. они используют что-то вроде 1 за кулисами для получения блокировки на объекте

2 голосов
/ 31 марта 2012

Да, вызов compareAndSwapObject преобразуется либо в собственный вызов метода, либо во встроенное расширение, которое выполняет сравнение и замену с использованием собственных аппаратных средств.

Что касается реализации ключевого слова synchronized, можно использовать любое количество методов, но все они концептуально напоминают сравнение и обмен.

1 голос
/ 31 марта 2012

Точный ответ на ваш вопрос зависит от реализации.

Смотрите здесь документацию по атомарному пакету: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/package-summary.html

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

0 голосов
/ 17 июля 2012

Возможно, вам придется взглянуть на то, что Intel предлагает для своего семейства процессоров x86.

Реализация масштабируемых атомарных блокировок для многоядерных архитектур Intel em64t и ia32.

...