Cepillo preguntas de la entrevista 15: parte inferior sincronizada es la forma de lograr?

image.png


Todas las escenas están sincronizados bloqueo en. Cerradura jugar un papel importante en la programación concurrente.


Estaba Li Fuchun, preparo para la entrevista, los temas son:




Cómo sincronizada inferior se consigue?

A: JVM sincronizado se implementa en la capa inferior, es decir, c ++ escrito, se implementa sobre la base de un par de MonitorEnter sincronizada, instrucciones MonitorExit implementadas, objetos de monitor son, básicamente, sincronizados unidad.


En java6, monitor de mutex del sistema operativo interno requiere espacio en el espacio de usuario y el modo de núcleo de conmutación, funcionamiento síncrono es una operación relativamente pesada, la sobrecarga es relativamente grande.


Después Java7, monitor, hay tres diferentes implementaciones que el bloqueo de inclinación, de peso ligero de bloqueo, bloqueo de peso pesado.


cabecera del objeto markword base, los indicios en el hilo de desviación de la identificación, en la ausencia de competencia, el uso de pestillo sesgada;
cuando hay una pluralidad de hilos para bloquear la competencia de inclinación, sobre la base de cabecera del objeto cas markword competir si nos pasaron a la cerradura de peso ligero.
No conseguir la actualización para el bloqueo de peso pesado;


rebaja de bloqueo se produce cuando JVM en el punto de control de seguridad, para supervisar rebaja.


implementación subyacente sincronizado


estructura de la cabecera del objeto:

image.png




SharedRuntime.cpp intérprete de ejecución de la clase base y el compilador. `` `Cpp

H_obj manija (rosca, obj);
si (UseBiasedLocking) {
// Reintentar entrada rápida si el sesgo es revocado para evitar la inflación innecesaria
ObjectSynchronizer :: fast_enter (h_obj, bloqueo, es cierto, CHECK);
} Else {
ObjectSynchronizer :: slow_enter (h_obj, bloqueo, CHECK);
}


<br />
<br />偏斜锁逻辑代码:<br />

```cpp

void ObjectSynchronizer::fast_enter(Handle obj, BasicLock* lock,
                                  bool attempt_rebias, TRAPS) {
  if (UseBiasedLocking) {
    if (!SafepointSynchronize::is_at_safepoint()) {
      BiasedLocking::Condition cond = BiasedLocking::revoke_and_rebias(obj, attempt_rebias, THREAD);
      if (cond == BiasedLocking::BIAS_REVOKED_AND_REBIASED) {
        return;
      }
  } else {
      assert(!attempt_rebias, "can not rebias toward VM thread");
      BiasedLocking::revoke_at_safepoint(obj);
  }
    assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
  }
 
  slow_enter(obj, lock, THREAD);
}



cerradura de peso ligero: `` `cpp

ObjectSynchronizer vacío :: slow_enter (obj manija, BasicLock * bloqueo, trampas) {
marca markOop = obj-> marca ();
si (marca-> is_neutral ()) {
//将目前的marca de la palabra复制到上Desplazada Cabecera
lock-> set_displaced_header (marca);
//利用CAS设置对象的marca de la palabra
si (marca == obj () -> cas_set_mark ((markOop) de bloqueo, marca)) {
TEvent (slow_enter: stacklock liberación);
regreso;
}
//检查存在竞争
} else if (marca-> has_locker () &&
THREAD-> is_lock_owned ((dirección) marca-> casillero ())) {
//清除
lock-> set_displaced_header (NULL);
regreso;
}

//重置Desplazada Cabecera
lock-> set_displaced_header (markOopDesc :: unused_mark ());
ObjectSynchronizer :: inflar (rosca,
obj (),
inflate_cause_monitor_enter) -> introducir (rosca);
}


<br />
<br />
<br />


# java体系中的锁

<br />
<br />
<br />java提供的锁有哪些<br />
<br />

![image.png](https://img2020.cnblogs.com/other/268922/202003/268922-20200327164950727-2125547505.png)

<br />
<br />
<br />
<br />再入读写锁:<br />
<br />

```java

public class RWSample {
  private final Map<String, String> m = new TreeMap<>();
  private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
  private final Lock r = rwl.readLock();
  private final Lock w = rwl.writeLock();
  public String get(String key) {
      r.lock();
      System.out.println("读锁锁定!");
      try {
          return m.get(key);
      } finally {
          r.unlock();
      }
  }

  public String put(String key, String entry) {
      w.lock();
  System.out.println("写锁锁定!");
        try {
            return m.put(key, entry);
        } finally {
            w.unlock();
        }
    }
  // …
  }


Optimización de los bloqueos de lectura y escritura: StampedLock
código es el siguiente:
en primer lugar determinar si el método de validación antes de leer escribiendo en el estado, si no está escrito en el estado, no con un bloqueo de lectura, evitando la sobrecarga;
de lo contrario aumentar la cerradura y asegurar la consistencia.


public class StampedSample {
  private final StampedLock sl = new StampedLock();

  void mutate() {
      long stamp = sl.writeLock();
      try {
          write();
      } finally {
          sl.unlockWrite(stamp);
      }
  }

  Data access() {
      long stamp = sl.tryOptimisticRead();
      Data data = read();
      if (!sl.validate(stamp)) {
          stamp = sl.readLock();
          try {
              data = read();
          } finally {
              sl.unlockRead(stamp);
          }
      }
      return data;
  }
  // …
}


resumen


Benpian introdujo por primera vez la implementación subyacente del principio de la sincronizada, describe tres tipos de niveles de java8 bloqueo introducidas, así como las actualizaciones de seguridad y las rebajas.


A continuación, se introduce otras cerraduras y optimización java escritura cerraduras escenarios de uso del sistema.








image.png

El original no es fácil, por favor indique la fuente.

Supongo que te gusta

Origin www.cnblogs.com/snidget/p/12582454.html
Recomendado
Clasificación