首先說明一下:方法鎖和對象鎖說的是一個東西,即只有方法鎖或對象鎖 和類鎖兩種鎖
作者用通俗易懂的語言將複雜的技術講解的如此透徹,學習,傳播。
原文地址:http://zhh9106.iteye.com/blog/2151791
在java編程中,經常需要用到同步,而用得最多的也許是synchronized關鍵字了,下面看看這個關鍵字的用法。
因為synchronized關鍵字涉及到鎖的概念,所以先來瞭解一些相關的鎖知識。
java的內建鎖:每個java對象都可以用做一個實現同步的鎖,這些鎖成為內建鎖。線程進入同步代碼塊或方法的時候會自動獲得該鎖,在退出同步代碼塊或方法時會釋放該鎖。獲得內建鎖的唯一途徑就是進入這個鎖的保護的同步代碼塊或方法。
java內建鎖是一個互斥鎖,這就是意味著最多隻有一個線程能夠獲得該鎖,當線程A嘗試去獲得線程B持有的內建鎖時,線程A必須等待或者阻塞,知道線程B釋放這個鎖,如果B線程不釋放這個鎖,那麼A線程將永遠等待下去。
java的對象鎖和類鎖:java的對象鎖和類鎖在鎖的概念上基本上和內建鎖是一致的,但是,兩個鎖實際是有很大的區別的,對象鎖是用於對象執行個體方法,或者一個對象執行個體上的,類鎖是用於類的靜態方法或者一個類的class對象上的。我們知道,類的對象執行個體可以有很多個,但是每個類只有一個class對象,所以不同對象執行個體的對象鎖是互不干擾的,但是每個類只有一個類鎖。但是有一點必須注意的是,其實類鎖只是一個概念上的東西,並不是真實存在的,它只是用來協助我們理解鎖定執行個體方法和靜態方法的區別的
上面已經對鎖的一些概念有了一點瞭解,下面探討synchronized關鍵字的用法。
synchronized的用法:synchronized修飾方法和synchronized修飾代碼塊。
下面分別分析這兩種用法在對象鎖和類鎖上的效果。
對象鎖的synchronized修飾方法和代碼塊: Java代碼 public class TestSynchronized { public void test1() { synchronized(this) { int i = 5; while( i-- > 0) { System.out.println(Thread.currentThread().getName() + " : " + i); try { Thread.sleep(500); } catch (InterruptedException ie) { } } } } public synchronized void test2() { int i = 5; while( i-- > 0) { System.out.println(Thread.currentThread().getName() + " : " + i); try { Thread.sleep(500); } catch (InterruptedException ie) { } } } public static void main(String[] args) { final TestSynchronized myt2 = new TestSynchronized(); Thread test1 = new Thread( new Runnable() { public void run() { myt2.test1(); } }, "test1" ); Thread test2 = new Thread( new Runnable() { public void run() { myt2.test2(); } }, "test2" ); test1.start();; test2.start();