An object structure's header (40) allocates a two-bit synchronization-state
field (42) solely to monitor data for implementing synchronization on that
object. When the object is locked by a particular execution thread, or
when one or more execution threads are waiting for a lock or notification
on that object, its header contains a pointer to monitor resources in the
form of a linked list of lock records (50, 52, 54) associated with the
threads involved. The synchronization-state field (42) ordinarily contains
an indication of whether such a linked list exists and, if so, whether its
first member is associated with a thread that has a lock on the object.
When a thread attempts to gain access to that linked list, it employs an
atomic swap operation to place a special busy value in that lock-state
field (42) and write its execution-environment pointer into the object's
header (40). If the previous value of that field was not the special busy
value, the thread uses the header's previous contents to perform its
intended synchronization operation. Otherwise, it obtains that information
through its own execution environment (44, 46, or 48) or that of the
thread whose identifier the object header previously contained. When the
thread completes its synchronization operation, it employs an atomic
compare-and-swap operation to write the results into the object's header
if that header still contains the thread identifier that the thread
originally wrote there. Otherwise, it communicates that information to its
successor thread if the thread identifier is different and thereby
indicates that at least one successor is contending for access to the
linked list.
L'intestazione della struttura dell'oggetto (40) assegna solamente un campo della due-punta synchronization-dichiarare (42) per controllare i dati per effettuare la sincronizzazione su quell'oggetto. Quando l'oggetto è bloccato da un filetto particolare di esecuzione, o quando uno o più filetti di esecuzione stanno aspettando una serratura o una notifica su quell'oggetto, la relativa intestazione contiene un indicatore per controllare le risorse sotto forma d'una lista collegata delle annotazioni della serratura (50, 52, 54) connesse con i filetti in questione. Il campo di synchronization-dichiarare (42) ordinariamente contiene un'indicazione di se una lista collegata esiste e, in caso affermativo, se il relativo primo membro è associato con un filetto che ha una serratura sull'oggetto. Quando un filetto tenta di accedere a quella lista collegata, impiega un funzionamento atomico di scambio per disporre un valore occupato speciale in quanto campo di lock-dichiarare (42) e scrive il relativo indicatore dell'esecuzione-ambiente nell'intestazione dell'oggetto (40). Se il valore precedente di quel campo non fosse il valore occupato speciale, il filetto usa il soddisfare precedente dell'intestazione per realizzare il relativo funzionamento progettato di sincronizzazione. Altrimenti, ottiene quelle informazioni con il relativo proprio ambiente di esecuzione (44, 46, o 48) o quello del filetto di cui il contrassegno l'intestazione dell'oggetto precedentemente ha contenuto. Quando il filetto completa il relativo funzionamento di sincronizzazione, impiega un atomico confront-e-scambia il funzionamento per scrivere i risultati nell'intestazione dell'oggetto se quell'intestazione ancora contiene il contrassegno del filetto che il filetto originalmente ha scritto là. Altrimenti, comunica che le informazioni al relativo filetto del successore se il contrassegno del filetto è differente e quindi indica che almeno un successore sta contendendosi accesso alla lista collegata.