synchronized

Das Macro synchronized ist gedacht zur Verwendung in Methoden (siehe defmethod), deren Rümpfe für eine Instanz nicht nebenläufig ausgeführt werden sollen.

Dazu weist man zunächst einer Instanzvariable eine Sperre als Wert zu (siehe make-lock und assign). Der Name der Instanzvariable und die Instanz werden dann beim Aufruf von synchronized angegeben, um die Auswertung eines Ausdrucks vor Nebenläufigkeit zu schützen:

  (synchronized name instance expr)

wobei name der Name der Instanzvariable ist, instance die Instanz und expr der geschützte Ausdruck. Das Macro expandiert zu:

  (with-lock (slot-value instance (quote name)) expr).

Das Macro basiert auf first, second, third, list, with-lock, slot-value und quote:

(setq synchronized
  (mlambda args
    (list
      with-lock
      (list
        slot-value
        (second args)
        (list quote (first args)))
      (third args))))