Изменения

Перейти к: навигация, поиск

Очередь Майкла и Скотта

398 байт убрано, 01:39, 2 октября 2018
Реализация push
'''while''' ('''true'''): <font color=green>//CAS-цикл</font>
tail = T.get()
'''if ''' ('''CAS'''(tail.next, '''null''', newTail)): <font color=green> /* Если T указывает на последний добавленный элемент и получилось добавить ещё один элемент в хвост,
пробуем передвинуть T. Если не получилось передвинуть T,
значит, другой поток сделал это за нас, завершаем работу.
если Если получилось - то мы сами передвинули T, завершаем работу */ </font>
'''CAS'''(T, tail, newTail)
'''return'''
else:  val newTail = Node(x, AtomicReference(null))  while (true) { val tail <font color= T.get() if (tail.next.compareAndSet(null, newTail)) { green>/* Если T - не последний добавленный элемент, добавляем ещё один элемент в хвост и пробуем передвинуть T. Если не получилось передвинуть T, значит, другой поток сделал это за нас, завершаем работу */ T.compareAndSet(tail, newTail) return } else { /* Если T - не последний элемент, то передвигаем T на последний элемент Если этого сделать не получилось, значит, это сделал другой поток. Если получилось - значит, наш поток передвинул T на текущий последний элемент. В любом случае, возвращаемся в начало CAS-цикла, чтобы завершить добавление в очередьновой вершины. */</font> '''CAS'''(T.compareAndSet(, tail, tail.next.get()) } }
==Примечания==
Анонимный участник

Навигация