代碼:
<code>/*</code>
<code> </code><code>* DESCRIPTION : </code>
<code> </code><code>* USER : zhouhui</code>
<code> </code><code>* DATE : 2017/8/2 10:12</code>
<code> </code><code>*/</code>
<code>public class DeadLockDemo {</code>
<code> </code><code>public static void main(String[] args) {</code>
<code> </code><code>//分别定義兩個被鎖的對象</code>
<code> </code><code>Entity entity1 = new Entity("entity1");</code>
<code> </code><code>Entity entity2 = new Entity("entity2");</code>
<code> </code><code>//定義兩個線程,并設定不同的名字</code>
<code> </code><code>new Thread(new MyR(entity1,entity2),"Thread 1").start();</code>
<code> </code><code>new Thread(new MyR(entity2,entity1),"Thread 2").start();</code>
<code> </code><code>}</code>
<code>}</code>
<code>class MyR implements Runnable{</code>
<code> </code><code>private Entity entity1;</code>
<code> </code><code>private Entity entity2;</code>
<code> </code><code>public MyR(Entity entity1,Entity entity2){</code>
<code> </code><code>this.entity1 = entity1;</code>
<code> </code><code>this.entity2 = entity2;</code>
<code> </code><code>public void run() {</code>
<code> </code><code>System.out.println(Thread.currentThread().getName() + "嘗試獲得"+entity1.getName()+"的鎖");</code>
<code> </code><code>synchronized (entity1){//嘗試獲得第一個鎖</code>
<code> </code><code>System.out.println(Thread.currentThread().getName() + "獲得"+entity1.getName()+"的鎖");</code>
<code> </code><code>try {</code>
<code> </code><code>Thread.sleep(1000);</code>
<code> </code><code>} catch (InterruptedException e) {</code>
<code> </code><code>e.printStackTrace();</code>
<code> </code><code>}</code>
<code> </code><code>System.out.println(Thread.currentThread().getName() + "嘗試獲得"+entity2.getName()+"的鎖");</code>
<code> </code><code>synchronized (entity2){//嘗試獲得第二個鎖</code>
<code> </code><code>System.out.println(Thread.currentThread().getName() + "獲得"+entity2.getName()+"的鎖");</code>
<code> </code><code>try {</code>
<code> </code><code>Thread.sleep(1000);</code>
<code> </code><code>} catch (InterruptedException e) {</code>
<code> </code><code>e.printStackTrace();</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code>/**</code>
<code> </code><code>* 定義一個鎖的對象,為了友善區分定義一個name區分對象</code>
<code>class</code> <code>Entity{</code>
<code> </code><code>private</code> <code>String name;</code>
<code> </code><code>public</code> <code>Entity(String name) {</code>
<code> </code><code>this</code><code>.name = name;</code>
<code> </code><code>public</code> <code>String getName() {</code>
<code> </code><code>return</code> <code>name;</code>
<code> </code><code>public</code> <code>void</code> <code>setName(String name) {</code>
列印結果:
<code>Thread </code><code>1</code><code>嘗試獲得entity1的鎖</code>
<code>Thread </code><code>2</code><code>嘗試獲得entity2的鎖</code>
<code>Thread </code><code>1</code><code>獲得entity1的鎖</code>
<code>Thread </code><code>2</code><code>獲得entity2的鎖</code>
<code>Thread </code><code>2</code><code>嘗試獲得entity1的鎖</code>
<code>Thread </code><code>1</code><code>嘗試獲得entity2的鎖</code>
<code></code>
本文轉自 斯然在天邊 51CTO部落格,原文連結:http://blog.51cto.com/13172906/1952922,如需轉載請自行聯系原作者