Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Java's intrinsic locks (used with the <code>synchronized</code> keyword) are re-entrant. The lock required to enter <code>r1</code> is the same lock as the one required to enter <code>r</code>. A thread which already owns a lock is allowed to re-acquire it. You can think of there being a counter for the number of times a thread has acquired the same lock. In method <code>r1</code>, the calling thread has acquired the same lock twice. The lock is only available to other threads once the "count" goes back to zero; that is, once the thread that obtained the lock has released it exactly as many times as it obtained it.</p> <p><strong>Edit</strong>: Here is an example of five threads that each bounce between two mutually-recursive methods that both require the same lock. By running this example you can see that no thread will enter <code>methodOne</code> until the thread before it has completely finished recursing, and that there is no problem for the same thread to continually enter the same (or different) <code>synchronized</code> methods that share the same lock.</p> <pre><code>public class LockExample { private static synchronized void methodOne(int depth) { if (depth == 0) { return; } else { System.out.println(Thread.currentThread().getName() + " methodOne (in), depth " + depth); methodTwo(depth - 1); System.out.println(Thread.currentThread().getName() + " methodOne (out), depth " + depth); } } private static synchronized void methodTwo(int depth) { if (depth == 0) { return; } else { System.out.println(Thread.currentThread().getName() + " methodTwo (in), depth " + depth); methodOne(depth - 1); System.out.println(Thread.currentThread().getName() + " methodTwo (out), depth " + depth); } } public static void main(String[] args) { for (int i = 0; i &lt; 5; i++) { Thread t = new Thread(new Runnable() { @Override public void run() { methodOne(10); } }); t.setName("Thread" + i); t.start(); } } } </code></pre> <p>Sample output (sorry for length):</p> <pre><code>Thread0 methodOne (in), depth 10 Thread0 methodTwo (in), depth 9 Thread0 methodOne (in), depth 8 Thread0 methodTwo (in), depth 7 Thread0 methodOne (in), depth 6 Thread0 methodTwo (in), depth 5 Thread0 methodOne (in), depth 4 Thread0 methodTwo (in), depth 3 Thread0 methodOne (in), depth 2 Thread0 methodTwo (in), depth 1 Thread0 methodTwo (out), depth 1 Thread0 methodOne (out), depth 2 Thread0 methodTwo (out), depth 3 Thread0 methodOne (out), depth 4 Thread0 methodTwo (out), depth 5 Thread0 methodOne (out), depth 6 Thread0 methodTwo (out), depth 7 Thread0 methodOne (out), depth 8 Thread0 methodTwo (out), depth 9 Thread0 methodOne (out), depth 10 Thread2 methodOne (in), depth 10 Thread2 methodTwo (in), depth 9 Thread2 methodOne (in), depth 8 Thread2 methodTwo (in), depth 7 Thread2 methodOne (in), depth 6 Thread2 methodTwo (in), depth 5 Thread2 methodOne (in), depth 4 Thread2 methodTwo (in), depth 3 Thread2 methodOne (in), depth 2 Thread2 methodTwo (in), depth 1 Thread2 methodTwo (out), depth 1 Thread2 methodOne (out), depth 2 Thread2 methodTwo (out), depth 3 Thread2 methodOne (out), depth 4 Thread2 methodTwo (out), depth 5 Thread2 methodOne (out), depth 6 Thread2 methodTwo (out), depth 7 Thread2 methodOne (out), depth 8 Thread2 methodTwo (out), depth 9 Thread2 methodOne (out), depth 10 Thread3 methodOne (in), depth 10 Thread3 methodTwo (in), depth 9 Thread3 methodOne (in), depth 8 Thread3 methodTwo (in), depth 7 Thread3 methodOne (in), depth 6 Thread3 methodTwo (in), depth 5 Thread3 methodOne (in), depth 4 Thread3 methodTwo (in), depth 3 Thread3 methodOne (in), depth 2 Thread3 methodTwo (in), depth 1 Thread3 methodTwo (out), depth 1 Thread3 methodOne (out), depth 2 Thread3 methodTwo (out), depth 3 Thread3 methodOne (out), depth 4 Thread3 methodTwo (out), depth 5 Thread3 methodOne (out), depth 6 Thread3 methodTwo (out), depth 7 Thread3 methodOne (out), depth 8 Thread3 methodTwo (out), depth 9 Thread3 methodOne (out), depth 10 Thread1 methodOne (in), depth 10 Thread1 methodTwo (in), depth 9 Thread1 methodOne (in), depth 8 Thread1 methodTwo (in), depth 7 Thread1 methodOne (in), depth 6 Thread1 methodTwo (in), depth 5 Thread1 methodOne (in), depth 4 Thread1 methodTwo (in), depth 3 Thread1 methodOne (in), depth 2 Thread1 methodTwo (in), depth 1 Thread1 methodTwo (out), depth 1 Thread1 methodOne (out), depth 2 Thread1 methodTwo (out), depth 3 Thread1 methodOne (out), depth 4 Thread1 methodTwo (out), depth 5 Thread1 methodOne (out), depth 6 Thread1 methodTwo (out), depth 7 Thread1 methodOne (out), depth 8 Thread1 methodTwo (out), depth 9 Thread1 methodOne (out), depth 10 Thread4 methodOne (in), depth 10 Thread4 methodTwo (in), depth 9 Thread4 methodOne (in), depth 8 Thread4 methodTwo (in), depth 7 Thread4 methodOne (in), depth 6 Thread4 methodTwo (in), depth 5 Thread4 methodOne (in), depth 4 Thread4 methodTwo (in), depth 3 Thread4 methodOne (in), depth 2 Thread4 methodTwo (in), depth 1 Thread4 methodTwo (out), depth 1 Thread4 methodOne (out), depth 2 Thread4 methodTwo (out), depth 3 Thread4 methodOne (out), depth 4 Thread4 methodTwo (out), depth 5 Thread4 methodOne (out), depth 6 Thread4 methodTwo (out), depth 7 Thread4 methodOne (out), depth 8 Thread4 methodTwo (out), depth 9 Thread4 methodOne (out), depth 10 </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload