java synchronized關鍵字的用法以及鎖的等級:方法鎖、對象鎖、類鎖

來源:互聯網
上載者:User

首先說明一下:方法鎖和對象鎖說的是一個東西,即只有方法鎖或對象鎖 和類鎖兩種鎖


作者用通俗易懂的語言將複雜的技術講解的如此透徹,學習,傳播。

原文地址: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();    

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.