synchronized
私はスレッド、ロックなどについて学んでいます。したがって、キーワードやそれ以外のクラス (アトミック変数なし) は使用thread-safe
したくありません。semaphore
ReentrantLock
のサイズで順序LinkedList<T>
を同期させたいと思います(これは、関数と関数を持っていると仮定します)。すべてのリストをロックせずに、関数によって2つを置き換えることができるようにしたい.Node<T>
T
T
implements
interface
size
increment
lock
unlock
Nodes
T.getSize()
たとえば、スレッドが 1 つしかない場合、関数は次のような「古典的な」置換関数になります。
public void IncrementAndcheckReplace(Node<T> node)
{
node.getData().incrementSize();
Node nextNode = node.getNext();
if(nextNode == null)
return;
while(node.getData().getSize() > nextNode.getData().getSize())
{
node.getPrev().setNext(nextNode);
nextNode.setPrev(node.getPrev());
Node nextnext = nextNode.getNext();
nextNode.setNext(node);
node.setPrev(nextNode);
node.setNext(nextnext);
nextnext.setPrev(node);
nextNode = node.getNext();
if(nextNode == null)
break;
}
}
同期の問題に取り掛かりましょう。
lock
私は自分のためにを作成するためにそのようなことをしようと考えましたNodes
:
public void IncrementAndcheckReplace(Node<T> node)
{
node.lock(); //using fair ReentrantLock for specific node
node.getData().incrementSize();
Node nextNode = node.getNext();
if(nextNode == null)
{
node.unlock();
return;
}
nextNode.lock();
while(node.getData().getSize() > nextNode.getData().getSize())
{
Node prev = node.getPrev();
if(prev != null)
{
prev.lock();
prev.setNext(nextNode);
}
nextNode.setPrev(prev);
Node nextnext = nextNode.getNext();
if(nextnext != null)
{
nextnext.lock();
nextnext.setPrev(node);
}
nextNode.setNext(node);
node.setPrev(nextNode);
node.setNext(nextnext);
if(prev!=null)
prev.unlock();
if(nextnext!=null)
nextnext.unlock();
nextNode.unlock();
nextNode = node.getNext();
if(nextNode == null)
break;
nextNode.lock();
}
node.unlock();
}
問題は、これがスレッド セーフではないことであり、デッドロックが発生する可能性があります。たとえば、スレッド A が a で置換関数を使用しようとしてNode a, Node b
いa.next == b and b.prev==a
て、スレッド B が b で置換関数を使用しようとしている場合、両方がロックされ、どこにも到達しないと仮定します。
リスト全体thread safe
なしで置換機能を作成するにはどうすればよいですか? とlock
を避けたい。dead-lock
starvation
ありがとう!