aaaaa

aaaaa


<!DOCTYPE html><!-- saved from url=(0215)https://github.com/enhorse/java-interview/blob/master/concurrency.md#%D0%A0%D0%B0%D1%81%D1%81%D0%BA%D0%B0%D0%B6%D0%B8%D1%82%D0%B5-%D0%BE-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8-%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8-java --><html lang="en">

<body class="logged-in env-production page-responsive page-blob">

<div class="application-main " data-commit-hovercards-enabled="" data-discussion-hovercards-enabled="" data-issue-and-pr-hovercards-enabled=""> <div itemscope="" itemtype="http://schema.org/SoftwareSourceCode" class=""> <main>

<div class="container-xl clearfix new-discussion-timeline px-3 px-md-4 px-lg-5"> <div class="repository-content ">


<span class="pl-k">return</span> <span class="pl-c1">this</span>; }

<span class="pl-smi">T</span> <span class="pl-en">pop</span>() { semaphore<span class="pl-k">.</span>acquireUninterruptibly(); <span class="pl-k">try</span> { <span class="pl-k">Node&lt;<span class="pl-smi">T</span>&gt;</span> current <span class="pl-k">=</span> head; <span class="pl-k">if</span> (current <span class="pl-k">!=</span> <span class="pl-c1">null</span>) { head <span class="pl-k">=</span> head<span class="pl-k">.</span>next; <span class="pl-k">return</span> current<span class="pl-k">.</span>value; } <span class="pl-k">return</span> <span class="pl-c1">null</span>; } <span class="pl-k">finally</span> { semaphore<span class="pl-k">.</span>release(); } }

<span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-k">class</span> <span class="pl-en">Node</span>&lt;E&gt; { <span class="pl-k">private</span> <span class="pl-k">final</span> <span class="pl-smi">E</span> value; <span class="pl-k">private</span> <span class="pl-k">final</span> <span class="pl-k">Node&lt;<span class="pl-smi">E</span>&gt;</span> next;

<span class="pl-k">private</span> <span class="pl-en">Node</span>(<span class="pl-smi">E</span> <span class="pl-v">value</span>, <span class="pl-k">Node&lt;<span class="pl-smi">E</span>&gt;</span> <span class="pl-v">next</span>) { <span class="pl-c1">this</span><span class="pl-k">.</span>value <span class="pl-k">=</span> value; <span class="pl-c1">this</span><span class="pl-k">.</span>next <span class="pl-k">=</span> next; } }}</pre></div>

<h2><a id="user-content-напишите-минимальный-неблокирующий-arraylist-всего-четыре-метода--add-get-remove-size" class="anchor" aria-hidden="true" href="https://github.com/enhorse/java-interview/blob/master/concurrency.md#%D0%BD%D0%B0%D0%BF%D0%B8%D1%88%D0%B8%D1%82%D0%B5-%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%BD%D0%B5%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B9-arraylist-%D0%B2%D1%81%D0%B5%D0%B3%D0%BE-%D1%87%D0%B5%D1%82%D1%8B%D1%80%D0%B5-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0--add-get-remove-size"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>Напишите минимальный неблокирующий ArrayList (всего четыре метода — <code>add()</code>, <code>get()</code>, <code>remove()</code>, <code>size()</code>).</h2><div class="highlight highlight-source-java"><pre><span class="pl-k">class</span> <span class="pl-en">NonBlockingArrayList</span>&lt;T&gt; { <span class="pl-k">private</span> <span class="pl-k">volatile</span> <span class="pl-k">Object</span>[] content <span class="pl-k">=</span> <span class="pl-k">new</span> <span class="pl-smi">Object</span>[<span class="pl-c1">0</span>];

<span class="pl-k">NonBlockingArrayList&lt;<span class="pl-smi">T</span>&gt;</span> <span class="pl-en">add</span>(<span class="pl-smi">T</span> <span class="pl-v">item</span>) { <span class="pl-k">return</span> add(content<span class="pl-k">.</span>length, item); }

<span class="pl-k">NonBlockingArrayList&lt;<span class="pl-smi">T</span>&gt;</span> <span class="pl-en">add</span>(<span class="pl-k">int</span> <span class="pl-v">index</span>, <span class="pl-smi">T</span> <span class="pl-v">item</span>) { <span class="pl-k">if</span> (index <span class="pl-k">&lt;</span> <span class="pl-c1">0</span>) { <span class="pl-k">throw</span> <span class="pl-k">new</span> <span class="pl-smi">IllegalArgumentException</span>(); } <span class="pl-k">boolean</span> needsModification <span class="pl-k">=</span> index <span class="pl-k">&gt;</span> content<span class="pl-k">.</span>length <span class="pl-k">-</span> <span class="pl-c1">1</span>; <span class="pl-k">if</span> (<span class="pl-k">!</span>needsModification) { <span class="pl-k">if</span> (item <span class="pl-k">==</span> <span class="pl-c1">null</span>) { needsModification <span class="pl-k">=</span> content[index] <span class="pl-k">!=</span> <span class="pl-c1">null</span>; } <span class="pl-k">else</span> { needsModification <span class="pl-k">=</span> item<span class="pl-k">.</span>equals(content[index]); } } <span class="pl-k">if</span> (needsModification) { <span class="pl-k">final</span> <span class="pl-k">Object</span>[] renewed <span class="pl-k">=</span> <span class="pl-smi">Arrays</span><span class="pl-k">.</span>copyOf(content, <span class="pl-smi">Math</span><span class="pl-k">.</span>max(content<span class="pl-k">.</span>length, index <span class="pl-k">+</span> <span class="pl-c1">1</span>)); renewed[index] <span class="pl-k">=</span> item; content <span class="pl-k">=</span> renewed; } <span class="pl-k">return</span> <span class="pl-c1">this</span>; }

<span class="pl-k">NonBlockingArrayList&lt;<span class="pl-smi">T</span>&gt;</span> <span class="pl-en">remove</span>(<span class="pl-k">int</span> <span class="pl-v">index</span>) { <span class="pl-k">if</span> (index <span class="pl-k">&lt;</span> <span class="pl-c1">0</span> <span class="pl-k">||</span> index <span class="pl-k">&gt;=</span> content<span class="pl-k">.</span>length) { <span class="pl-k">throw</span> <span class="pl-k">new</span> <span class="pl-smi">IllegalArgumentException</span>(); } <span class="pl-k">int</span> size <span class="pl-k">=</span> content<span class="pl-k">.</span>length <span class="pl-k">-</span> <span class="pl-c1">1</span>; <span class="pl-k">final</span> <span class="pl-k">Object</span>[] renewed <span class="pl-k">=</span> <span class="pl-k">new</span> <span class="pl-smi">Object</span>[size]; <span class="pl-smi">System</span><span class="pl-k">.</span>arraycopy(content, <span class="pl-c1">0</span>, renewed, <span class="pl-c1">0</span>, index); <span class="pl-k">if</span> (index <span class="pl-k">+</span> <span class="pl-c1">1</span> <span class="pl-k">&lt;</span> size) { <span class="pl-smi">System</span><span class="pl-k">.</span>arraycopy(content, index <span class="pl-k">+</span> <span class="pl-c1">1</span>, renewed, index, size <span class="pl-k">-</span> index); } content <span class="pl-k">=</span> renewed; <span class="pl-k">return</span> <span class="pl-c1">this</span>; }

<span class="pl-smi">T</span> <span class="pl-en">get</span>(<span class="pl-k">int</span> <span class="pl-v">index</span>) { <span class="pl-k">return</span> (<span class="pl-smi">T</span>) content[index]; }

<span class="pl-k">int</span> <span class="pl-en">size</span>() { <span class="pl-k">return</span> content<span class="pl-k">.</span>length; }}</pre></div>

<h2><a id="user-content-напишите-потокобезопасную-реализацию-класса-с-неблокирующим-методом-biginteger-next-который-возвращает-элементы-последовательности-1-2-4-8-16-" class="anchor" aria-hidden="true" href="https://github.com/enhorse/java-interview/blob/master/concurrency.md#%D0%BD%D0%B0%D0%BF%D0%B8%D1%88%D0%B8%D1%82%D0%B5-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D1%83%D1%8E-%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8E-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0-%D1%81-%D0%BD%D0%B5%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%BC-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC-biginteger-next-%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B9-%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D0%B5%D1%82-%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8-1-2-4-8-16-"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>Напишите потокобезопасную реализацию класса с неблокирующим методом <code>BigInteger next()</code>, который возвращает элементы последовательности: <code>[1, 2, 4, 8, 16, ...]</code>.</h2><div class="highlight highlight-source-java"><pre><span class="pl-k">class</span> <span class="pl-en">PowerOfTwo</span> { <span class="pl-k">private</span> <span class="pl-k">AtomicReference&lt;<span class="pl-smi">BigInteger</span>&gt;</span> current <span class="pl-k">=</span> <span class="pl-k">new</span> <span class="pl-k">AtomicReference&lt;&gt;</span>(<span class="pl-c1">null</span>); <span class="pl-smi">BigInteger</span> <span class="pl-en">next</span>() { <span class="pl-smi">BigInteger</span> recent, next; <span class="pl-k">do</span> { recent <span class="pl-k">=</span> current<span class="pl-k">.</span>get(); next <span class="pl-k">=</span> (recent <span class="pl-k">==</span> <span class="pl-c1">null</span>) <span class="pl-k">?</span> <span class="pl-smi">BigInteger</span><span class="pl-k">.</span>valueOf(<span class="pl-c1">1</span>) <span class="pl-k">:</span> recent<span class="pl-k">.</span>shiftLeft(<span class="pl-c1">1</span>); } <span class="pl-k">while</span> (<span class="pl-k">!</span>current<span class="pl-k">.</span>compareAndSet(recent, next)); <span class="pl-k">return</span> next; }}</pre></div>

<h2><a id="user-content-напишите-простейший-многопоточный-ограниченный-буфер-с-использованием-synchronized" class="anchor" aria-hidden="true" href="https://github.com/enhorse/java-interview/blob/master/concurrency.md#%D0%BD%D0%B0%D0%BF%D0%B8%D1%88%D0%B8%D1%82%D0%B5-%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%B5%D0%B9%D1%88%D0%B8%D0%B9-%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B9-%D0%BE%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%B1%D1%83%D1%84%D0%B5%D1%80-%D1%81-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC-synchronized"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>Напишите простейший многопоточный ограниченный буфер с использованием <code>synchronized</code>.</h2><div class="highlight highlight-source-java"><pre><span class="pl-k">class</span> <span class="pl-en">QueueSynchronized</span>&lt;T&gt; { <span class="pl-k">private</span> <span class="pl-k">volatile</span> <span class="pl-k">int</span> size <span class="pl-k">=</span> <span class="pl-c1">0</span>; <span class="pl-k">private</span> <span class="pl-k">final</span> <span class="pl-k">Object</span>[] content; <span class="pl-k">private</span> <span class="pl-k">final</span> <span class="pl-k">int</span> capacity;

<span class="pl-k">private</span> <span class="pl-k">int</span> out; <span class="pl-k">private</span> <span class="pl-k">int</span> in;

<span class="pl-k">private</span> <span class="pl-k">final</span> <span class="pl-smi">Object</span> isEmpty <span class="pl-k">=</span> <span class="pl-k">new</span> <span class="pl-smi">Object</span>(); <span class="pl-k">private</span> <span class="pl-k">final</span> <span class="pl-smi">Object</span> isFull <span class="pl-k">=</span> <span class="pl-k">new</span> <span class="pl-smi">Object</span>();

<span class="pl-en">QueueSynchronized</span>(<span class="pl-k">final</span> <span class="pl-k">int</span> <span class="pl-v">capacity</span>) { <span class="pl-c1">this</span><span class="pl-k">.</span>capacity <span class="pl-k">=</span> capacity; content <span class="pl-k">=</span> <span class="pl-k">new</span> <span class="pl-smi">Object</span>[<span class="pl-c1">this</span><span class="pl-k">.</span>capacity]; out <span class="pl-k">=</span> <span class="pl-c1">0</span>; in <span class="pl-k">=</span> <span class="pl-c1">0</span>; size <span class="pl-k">=</span> <span class="pl-c1">0</span>; }

<span class="pl-k">private</span> <span class="pl-k">int</span> <span class="pl-en">cycleInc</span>(<span class="pl-k">int</span> <span class="pl-v">index</span>) { <span class="pl-k">return</span> (<span class="pl-k">++</span>index <span class="pl-k">==</span> capacity) <span class="pl-k">?</span> <span class="pl-c1">0</span> <span class="pl-k">:</span> index; }

<span class="pl-k">@SuppressWarnings</span>(<span class="pl-s"><span class="pl-pds">"</span>unchecked<span class="pl-pds">"</span></span>) <span class="pl-smi">T</span> <span class="pl-en">get</span>() <span class="pl-k">throws</span> <span class="pl-smi">InterruptedException</span> { <span class="pl-k">if</span> (size <span class="pl-k">==</span> <span class="pl-c1">0</span>) { <span class="pl-k">synchronized</span> (isEmpty) { <span class="pl-k">while</span> (size <span class="pl-k">&lt;</span> <span class="pl-c1">1</span>) { isEmpty<span class="pl-k">.</span>wait(); } } } <span class="pl-k">try</span> { <span class="pl-k">synchronized</span> (<span class="pl-c1">this</span>) { <span class="pl-k">final</span> <span class="pl-smi">Object</span> value <span class="pl-k">=</span> content[out]; content[out] <span class="pl-k">=</span> <span class="pl-c1">null</span>; <span class="pl-k">if</span> (size <span class="pl-k">&gt;</span> <span class="pl-c1">1</span>) { out <span class="pl-k">=</span> cycleInc(out); } size<span class="pl-k">--</span>; <span class="pl-k">return</span> (<span class="pl-smi">T</span>) value; } } <span class="pl-k">finally</span> { <span class="pl-k">synchronized</span> (isFull) { isFull<span class="pl-k">.</span>notify(); } } }

<span class="pl-k">QueueSynchronized&lt;<span class="pl-smi">T</span>&gt;</span> <span class="pl-en">put</span>(<span class="pl-smi">T</span> <span class="pl-v">value</span>) <span class="pl-k">throws</span> <span class="pl-smi">InterruptedException</span> { <span class="pl-k">if</span> (size <span class="pl-k">==</span> capacity) { <span class="pl-k">synchronized</span> (isFull) { <span class="pl-k">while</span> (size <span class="pl-k">==</span> capacity) { isFull<span class="pl-k">.</span>wait(); } } } <span class="pl-k">synchronized</span> (<span class="pl-c1">this</span>) { <span class="pl-k">if</span> (size <span class="pl-k">==</span> <span class="pl-c1">0</span>) { content[in] <span class="pl-k">=</span> value; } <span class="pl-k">else</span> { in <span class="pl-k">=</span> cycleInc(in); content[in] <span class="pl-k">=</span> value; } size<span class="pl-k">++</span>; } <span class="pl-k">synchronized</span> (isEmpty) { isEmpty<span class="pl-k">.</span>notify(); } <span class="pl-k">return</span> <span class="pl-c1">this</span>; }}</pre></div>

<h2><a id="user-content-напишите-простейший-многопоточный-ограниченный-буфер-с-использованием-reentrantlock" class="anchor" aria-hidden="true" href="https://github.com/enhorse/java-interview/blob/master/concurrency.md#%D0%BD%D0%B0%D0%BF%D0%B8%D1%88%D0%B8%D1%82%D0%B5-%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%B5%D0%B9%D1%88%D0%B8%D0%B9-%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B9-%D0%BE%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%B1%D1%83%D1%84%D0%B5%D1%80-%D1%81-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC-reentrantlock"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>Напишите простейший многопоточный ограниченный буфер с использованием <code>ReentrantLock</code>.</h2><div class="highlight highlight-source-java"><pre><span class="pl-k">class</span> <span class="pl-en">QueueReentrantLock</span>&lt;T&gt; {

<span class="pl-k">private</span> <span class="pl-k">volatile</span> <span class="pl-k">int</span> size <span class="pl-k">=</span> <span class="pl-c1">0</span>; <span class="pl-k">private</span> <span class="pl-k">final</span> <span class="pl-k">Object</span>[] content; <span class="pl-k">private</span> <span class="pl-k">final</span> <span class="pl-k">int</span> capacity;

<span class="pl-k">private</span> <span class="pl-k">int</span> out; <span class="pl-k">private</span> <span class="pl-k">int</span> in;

<span class="pl-k">private</span> <span class="pl-k">final</span> <span class="pl-smi">ReentrantLock</span> lock <span class="pl-k">=</span> <span class="pl-k">new</span> <span class="pl-smi">ReentrantLock</span>(); <span class="pl-k">private</span> <span class="pl-k">final</span> <span class="pl-smi">Condition</span> isEmpty <span class="pl-k">=</span> lock<span class="pl-k">.</span>newCondition(); <span class="pl-k">private</span> <span class="pl-k">final</span> <span class="pl-smi">Condition</span> isFull <span class="pl-k">=</span> lock<span class="pl-k">.</span>newCondition();

<span class="pl-en">QueueReentrantLock</span>(<span class="pl-k">int</span> <span class="pl-v">capacity</span>) { <span class="pl-k">try</span> { lock<span class="pl-k">.</span>lock(); <span class="pl-c1">this</span><span class="pl-k">.</span>capacity <span class="pl-k">=</span> capacity; content <span class="pl-k">=</span> <span class="pl-k">new</span> <span class="pl-smi">Object</span>[capacity]; out <span class="pl-k">=</span> <span class="pl-c1">0</span>; in <span class="pl-k">=</span> <span class="pl-c1">0</span>; } <span class="pl-k">finally</span> { lock<span class="pl-k">.</span>unlock(); } }

<span class="pl-k">private</span> <span class="pl-k">int</span> <span class="pl-en">cycleInc</span>(<span class="pl-k">int</span> <span class="pl-v">index</span>) { <span class="pl-k">return</span> (<span class="pl-k">++</span>index <span class="pl-k">==</span> capacity) <span class="pl-k">?</span> <span class="pl-c1">0</span> <span class="pl-k">:</span> index; }

<span class="pl-k">@SuppressWarnings</span>(<span class="pl-s"><span class="pl-pds">"</span>unchecked<span class="pl-pds">"</span></span>) <span class="pl-smi">T</span> <span class="pl-en">get</span>() <span class="pl-k">throws</span> <span class="pl-smi">InterruptedException</span> { <span class="pl-k">try</span> { lock<span class="pl-k">.</span>lockInterruptibly(); <span class="pl-k">if</span> (size <span class="pl-k">==</span> <span class="pl-c1">0</span>) { <span class="pl-k">while</span> (size <span class="pl-k">&lt;</span> <span class="pl-c1">1</span>) { isEmpty<span class="pl-k">.</span>await(); } } <span class="pl-k">final</span> <span class="pl-smi">Object</span> value <span class="pl-k">=</span> content[out]; content[out] <span class="pl-k">=</span> <span class="pl-c1">null</span>; <span class="pl-k">if</span> (size <span class="pl-k">&gt;</span> <span class="pl-c1">1</span>) { out <span class="pl-k">=</span> cycleInc(out); } size<span class="pl-k">--</span>; isFull<span class="pl-k">.</span>signal(); <span class="pl-k">return</span> (<span class="pl-smi">T</span>) value; } <span class="pl-k">finally</span> { lock<span class="pl-k">.</span>unlock(); } }

<span class="pl-k">QueueReentrantLock&lt;<span class="pl-smi">T</span>&gt;</span> <span class="pl-en">put</span>(<span class="pl-smi">T</span> <span class="pl-v">value</span>) <span class="pl-k">throws</span> <span class="pl-smi">InterruptedException</span> { <span class="pl-k">try</span> { lock<span class="pl-k">.</span>lockInterruptibly(); <span class="pl-k">if</span> (size <span class="pl-k">==</span> capacity) { <span class="pl-k">while</span> (size <span class="pl-k">==</span> capacity) { isFull<span class="pl-k">.</span>await(); } } <span class="pl-k">if</span> (size <span class="pl-k">==</span> <span class="pl-c1">0</span>) { content[in] <span class="pl-k">=</span> value; } <span class="pl-k">else</span> { in <span class="pl-k">=</span> cycleInc(in); content[in] <span class="pl-k">=</span> value; } size<span class="pl-k">++</span>; isEmpty<span class="pl-k">.</span>signal(); } <span class="pl-k">finally</span> { lock<span class="pl-k">.</span>unlock(); } <span class="pl-k">return</span> <span class="pl-c1">this</span>; }}</pre></div>

</article> </div>

</div>

</div></div>

</main> </div>

</div>







</body></html>

Report Page