1. 程式人生 > >java synchronized關鍵字的用法以及鎖的等級:方法鎖、物件鎖、類鎖

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

轉載自:http://blog.csdn.net/le_le_name/article/details/52348314

java的內建鎖:每個java物件都可以用做一個實現同步的鎖,這些鎖成為內建鎖。執行緒進入同步程式碼塊或方法的時候會自動獲得該鎖,在退出同步程式碼塊或方法時會釋放該鎖。獲得內建鎖的唯一途徑就是進入這個鎖的保護的同步程式碼塊或方法。

java內建鎖是一個互斥鎖,這就是意味著最多隻有一個執行緒能夠獲得該鎖,當執行緒A嘗試去獲得執行緒B持有的內建鎖時,執行緒A必須等待或者阻塞,知道執行緒B釋放這個鎖,如果B執行緒不釋放這個鎖,那麼A執行緒將永遠等待下去。

java的物件鎖和類鎖:java的物件鎖和類鎖在鎖的概念上基本上和內建鎖是一致的,但是,兩個鎖實際是有很大的區別的,物件鎖是用於物件例項方法,或者一個物件例項上的,類鎖是用於類的靜態方法或者一個類的class物件上的。我們知道,類的物件例項可以有很多個,但是每個類只有一個class物件,所以不同物件例項的物件鎖是互不干擾的,但是每個類只有一個類鎖。但是有一點必須注意的是,其實類鎖只是一個概念上的東西,並不是真實存在的,它只是用來幫助我們理解鎖定例項方法和靜態方法的區別的

上面已經對鎖的一些概念有了一點了解,下面探討synchronized關鍵字的用法。

synchronized的用法:synchronized修飾方法和synchronized修飾程式碼塊。

其實,類鎖修飾方法和程式碼塊的效果和物件鎖是一樣的,因為類鎖只是一個抽象出來的概念,只是為了區別靜態方法的特點,因為靜態方法是所有物件例項共用的,所以對應著synchronized修飾的靜態方法的鎖也是唯一的,所以抽象出來個類鎖。其實這裡的重點在下面這塊程式碼,synchronized同時修飾靜態和非靜態方法

synchronized的缺陷:當某個執行緒進入同步方法獲得物件鎖,那麼其他執行緒訪問這裡物件的同步方法時,必須等待或者阻塞,這對高併發的系統是致命的,這很容易導致系統的崩潰。如果某個執行緒在同步方法裡面發生了死迴圈,那麼它就永遠不會釋放這個物件鎖,那麼其他執行緒就要永遠的等待。這是一個致命的問題。


一個類的物件鎖和另一個類的物件鎖是沒有關聯的,當一個執行緒獲得A類的物件鎖時,它同時也可以獲得B類的物件鎖。



相關推薦

java synchronized關鍵字用法以及等級方法物件

轉載自:http://blog.csdn.net/le_le_name/article/details/52348314 java的內建鎖:每個java物件都可以用做一個實現同步的鎖,這些鎖成為內建鎖。執行緒進入同步程式碼塊或方法的時候會自動獲得該鎖,在退出同步程式碼塊

JAVA synchronized關鍵字機制(中)

就會 16px ride tar rac 效果 sync 靜態方法 訪問 synchronized 鎖機制簡單的用法,高效的執行效率使成為解決線程安全的首選。 下面總結其特性以及使用技巧,加深對其理解。 特性:   1. Java語言的關鍵字,當它用來修飾一個方法或者一個代

巨人大哥談Java中的Synchronized關鍵字用法

技術 class method state 總結 object oid ack body 巨人大哥談Java中的Synchronized關鍵字用法 認識synchronized 對於寫多線程程序的人來說,經常碰到的就是並發問題,對於容易出現並發問題的地方價格synchron

Java中的Synchronized關鍵字用法

認識synchronized 對於寫多執行緒程式的人來說,經常碰到的就是併發問題,對於容易出現併發問題的地方加上synchronized修飾符基本上就搞定 了,如果說不考慮效能問題的話,這一招絕對能應對百分之九十以上的情況,若對於效能方面有要求的話就需要額外的知識比如讀寫鎖等等。本文目的先了解透徹synch

java synchronized的理解以及內建物件

在java程式設計中,經常需要用到同步,而用得最多的也許是synchronized關鍵字了,下面看看這個關鍵字的用法。 因為synchronized關鍵字涉及到鎖的概念,所以先來了解一些相關的鎖知識。 java的內建鎖:每個java物件都可以用做一個實現

JAVA synchronized實現原理以及其中優化的歸納總結

在java中存在兩種鎖機制,分別是synchronized和Lock。Lock介面和實現類是JDK5新增的內容,而synchronized在JDK6開始提供了一系列的鎖優化,下面總結一下synchronized的實現原理和涉及的一些鎖優化機制 1.sync

Java:synchronized關鍵字引出的多種

前言 Java 中的 synchronized關鍵字可以在多執行緒環境下用來作為執行緒安全的同步鎖。本文不討論 synchronized 的具體使用,而是研究下synchronized底層的鎖機制,以及這些鎖分別的優缺點。 一 synchronized機制 synchronized關鍵字是JAVA中常用的

java synchronized關鍵字的底層實現

重排序 代碼 logs this 底層實現 com 實現 alt 關鍵字 每個對象都有一個鎖(Monitor,監視器鎖),class對象也有鎖,如果synchronized關鍵字修飾同步代碼塊,通過反編譯可以看到,其實是有個monitorenter和monitorexit指

java中equals的另用法以及Objects中其他方法介紹

equals方法對於java程式設計師來說應該是常用的方法,它通常用來對字串型別的比較,通常,我們的寫法是這樣: //案例1 Map<String,Object> map1 = new HashMap<>(); Map<String,Object>

java synchronized關鍵字在jvm中的實現原理

為了實現共享資源的執行緒安全,我們常常會使用synchronzied關鍵字來為資源加鎖,在一個執行緒操作資源的時候,將資源鎖住只供自己使用。這樣保證了執行緒使用資源的同步,避免了對資源同時讀寫造成讀寫結果異常的情況。 那麼,synchronized關鍵字在我們的jvm中具體是怎麼實現的呢

Java static的用法以及原理

靜態:static 用法:是一個修飾符,用於修飾成員(成員變數,成員函式),   當成員被靜態修飾後,就多了一個呼叫方式,除了可以被物件呼叫外,還可以直接被類名調:類名.靜態成員     類名.靜態成員 存在:方法區,共享區,資料區(非堆記憶體、棧記憶體

Java監聽器的用法(一)內部類監聽器

當在處理按鈕等監聽事件時,需要註冊監聽器,監聽器的位置不同,角色就不同,訪問的區域就不同。 內部類是在另一個類中宣告的,包含內部類的類叫做外嵌類 內部類和外嵌類的關係: 1.內部類的外嵌類的成員變

volatile關鍵字用法以及執行緒資料可見性的問題

最近在研究ConcurrentHashMap的原始碼的時候,發現底層實現的Segments使用到了關鍵字volatile 不太明白這個關鍵字的用法,查了一些資料總結如下: volatile 的作用是讓變數在多個執行緒可見。 說實話這個定義也有點籠統

Java synchronized關鍵字使用小結

1. 在編寫一個類時,如果該類中的程式碼可能執行與多執行緒環境下,就要考慮同步問題了。會同時被多個執行緒訪問的資源,就是競爭資源,也稱為競爭條件。對於多執行緒共享的資源我們必須進行同步,以避免一個執行緒的改動被另一個執行緒所覆蓋。synchronized 關鍵字有兩種作用域:

android synchronized 關鍵字用法

synchronized是java中表示同步程式碼快的關鍵字。可以放在方法修飾符前,比如private synchronized void test(){}, 也可以放在方法內部,修飾某一段特定的程式碼。 synchronized有一個地方需要注意,就是在給普通方法加鎖與給

java synchronized 關鍵字(1)物件監視器為Object

在java多執行緒中 synchronized 是非常重要的,也是經常用到的 對於synchronized關鍵字要注意兩點 synchronized物件監視器為Object的時候 synchronized物件監視器為Class的時候 物件監視器為

關於java synchronized關鍵字的一些理解

看了java程式設計思想的併發這一章,發現對於synchronized關鍵字理解不夠到位,看了其他人的部落格,加深了一些理解:http://www.cnblogs.com/GnagWang/archi

Java synchronized 關鍵字詳解

Java synchronized 關鍵字詳解 前置技能點 程序和執行緒的概念 執行緒建立方式 執行緒的狀態狀態轉換 執行緒安全的概念 synchronized 關鍵字的幾種用法 修飾非靜態成員方法 synchronized public void sync(){ } 修飾靜態成員方法 synchro

python中關於if的用法以及with open的方法

採用if判斷語句時,只要後面不是False 和none以及0和空資料,都是正常執行後面的程式碼。 eg:(ubuntu terminal) ipython 1.if True: print(“a”) a 2.if False: print(“a”) 3.if 10 == 1 :

JAVA多執行緒機制第二彈(程式碼)Thread的子建立執行緒

在Java中,執行緒物件的建立是用Threa類或者它的子類建立。 在編寫Thread類的子類時,需要重寫父類的run()方法,其目的是規定執行緒的具體操作,否則執行緒就沒有開始的地方 在這裡,做一個小小總結:  ··線上程的編寫的時候,要重寫父類的run()方法,在ru