atomic { int x = lst.head; lst = lst.tail; … }
В этой конструкции можно также использовать предохранитель, не позволяющий выполняться транзакции, пока не выполнится указанное условие.
Существенное внимание уделялось исследованию политик выбора транзакции, которую следует аварийно завершить в случае конфликтов [10, 28]. Ни одна политика не обеспечивает наилучшее поведение во всех случаях, однако в целом неплохо работает политика «полька» (polka). При применении этой политики для каждой транзакции запоминается число открытых ей объектов, и этот счетчик используется в качестве ее приоритета. Если какая-то транзакция пытается запросить доступ к некоторому объекту, то это приводит к немедленному аварийному завершению конфликтующей транзакции с более низким приоритетом. Если приоритет у транзакции, запрашивающей доступ, оказывается ниже, чем у конфликтующей с ней транзакции, то она откатывается N раз, где N равно разнице в приоритетах, с экспоненциально возрастающим временным интервалом между попытками. Другими словами, такой транзакции дается N попыток получить доступ к требуемому объекту, и после каждой неудачной попытки она откатывается и выполняется заново.