2013-03-24 4 views
1

synchronized используется в Java для работы с мьютексом. Однако реализации интерфейса Lock, такие как ReentrantLock в Java не использует это ключевое слово. Весь код выглядит просто нормальным кодом. Тогда как он обрабатывает несколько потоков на земле?Почему в реализации блокировки Java нет синхронизированного ключевого слова?

Я считаю, что следующие части коды связаны:

Метод tryAcquire в Sync из ReentrantLock

protected final boolean tryAcquire(int acquires) { 
    final Thread current = Thread.currentThread(); 
    int c = getState(); 
    if (c == 0) { 
     if (!hasQueuedPredecessors() && 
      compareAndSetState(0, acquires)) { 
      setExclusiveOwnerThread(current); 
      return true; 
     } 
    } 
    else if (current == getExclusiveOwnerThread()) { 
     int nextc = c + acquires; 
     if (nextc < 0) 
      throw new Error("Maximum lock count exceeded"); 
     setState(nextc); 
     return true; 
    } 
    return false; 
} 

Sync расширяет AbstractQueuedSynchronizer и связанный код:

final boolean acquireQueued(final Node node, int arg) { 
    boolean failed = true; 
    try { 
     boolean interrupted = false; 
     for (;;) { 
      final Node p = node.predecessor(); 
      if (p == head && tryAcquire(arg)) { 
       setHead(node); 
       p.next = null; // help GC 
       failed = false; 
       return interrupted; 
      } 
      if (shouldParkAfterFailedAcquire(p, node) && 
       parkAndCheckInterrupt()) 
       interrupted = true; 
     } 
    } finally { 
     if (failed) 
      cancelAcquire(node); 
    } 
} 

Так кажется нет synchronized используется, тогда как он гарантирует немой Икс?

ответ

4

Поскольку Java 1.5 (?) Поддерживает JVM для аппаратной блокировки с использованием так называемых Compare-And-Swap методов. Просто следуйте за источниками до момента, когда это вызвано.

Также см бумаги Doug Lea для лучшего понимания: http://gee.cs.oswego.edu/dl/papers/aqs.pdf

+0

Yea. Нашел его, и у него есть родное ключевое слово. Значит, соответствующий код на самом деле не java? – NSF

+1

Это код, в котором написана JVM. Для Oracle это C++, для IBM это сама Java :-) – Sebastian

+0

Gotcha. Благодарю. – NSF

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