1. 程式人生 > >對synchronized的理解

對synchronized的理解

其實如果不懂,自己寫一個例子出來跑一跑,就什麼都知道了。

synchronized一共兩種用法:

1、放在方法前面宣告方法

2、synchronized(xxx){ //TODO} 形成程式碼塊

第一種放在方法前面宣告方法時,即:

public synchronized void func(){
		//TODO
	}
假設此方法分別被Thread_1和Thread_2兩條執行緒無限迴圈地呼叫,那麼此時的呼叫順序為:


可以看到,當方法被執行緒1呼叫完,就會立刻被執行緒2呼叫;執行緒2呼叫完畢,又會立刻被執行緒1呼叫,該方法是不會同時呼叫的。

第二種程式碼塊的方法,用於作為執行緒鎖的東西有很多,分別有:

1、普通物件

public Object mLock = new Object();

public void func(){
    synchronized(mLock){
        //TODO
    }
}

這種寫法是針對同一個物件中,多條執行緒的同步問題的。

假如我在一個物件中,有多個內部方法都用到了這個鎖,然後分別被多個執行緒所呼叫,那麼執行緒間會根據這個mLock成員的監控情況進行執行緒同步。

比如,當前有func1()、func2()、func3()、func4()四個方法都用到這個程式碼塊執行緒鎖,而有Thread_1、Thread_2、Thread_3、Thread_4條執行緒分別呼叫這四個方法並同時開啟執行緒。雖然執行緒是同步開啟,但是從哪個執行緒開始先執行是不確定的,我們假設執行緒1先被執行,此時mLock被fun1中的程式碼塊所監控著,執行緒2、3、4都必須等待這個mLock被釋放了,才可以繼續執行,否則將一直等待,直到執行緒1中的fun1被執行完成,然後mLock被釋放為止。

2、靜態物件

public static Object mLock = new Object();
呼叫方法和上述1中的方式一樣,不同之處在於程式碼塊中的執行緒鎖物件為靜態物件。

靜態物件是針對同一個類的多個物件中,每個物件之間的執行緒同步問題的。

舉個例子,在一個類中,有一個靜態變數:

public static int index = 0;

此時我們生成了3個這個類的物件,每個例項都可以呼叫執行緒改變這個index,比如為其遞增1(index++)。並且加到index = 20時就退出不再改變。

如果不進行執行緒同步,就會發生index被同時index++,此時index將出現超過20的情況。所以就要用到這個靜態物件的鎖,保證多個物件之間各自的執行緒能保持同步。

3、synchronized(this)

這裡的用法和上述1中的意思和作用一樣,不同的是,1中用的鎖的成員為自己定義的Object,而這裡的鎖的成員為當前類的例項。

比如,當前有一個類Class_1,這個類中的方法用了這個synchronized(this)。而這個類所生成了兩個物件class_object_1和class_object_2。那麼對於這兩個物件而言,他們的synchronized(this)中的this就是指其物件本身,即class_object_1這個物件的中的synchronized(this)中的this指的是class_object_1。

4、synchronized(Class.this)

這裡的用法和上述2中的意思和作用一樣。

相關推薦

synchronized鎖的理解

public class MyObject { synchronized public void methodA() { //do something.... } } 在方法前加上synchronized是物件鎖,同一物件呼叫該方法互斥 pub

synchronized理解

其實如果不懂,自己寫一個例子出來跑一跑,就什麼都知道了。 synchronized一共兩種用法: 1、放在方法前面宣告方法 2、synchronized(xxx){ //TODO} 形成程式碼塊 第一種放在方法前面宣告方法時,即: public synchronized

【大廠面試07期】說一說你synchronized鎖的理解

synchronized鎖的原理也是大廠面試中經常會涉及的問題,本文主要通過對以下問題進行分析講解,來幫助大家理解synchronized鎖的原理。 1.synchronized鎖是什麼?鎖的物件是什麼? 2.偏向鎖,輕量級鎖,重量級鎖的執行流程是怎樣的? 3.為什麼說是輕量級,重量級鎖是不公平的?

php面向理解(一)

構造方法 nds nbsp his ade 也不能 func 私有屬性 rom 常用的繼承過程,以及對public、private、protected修飾符的理解: /*****************************父類*********************

reducers 理解

body initials return 理解 big neu spa obj 對象 var reducers = { totalInEuros : function(state, item) { return state.euro

synchronized理解與總結

public mar 環境 new t 觀察 初始 down ble () synchronized理解與總結 第一次實現的代碼分析(不一定哪個線程搶到任務,搶到的線程會一直把任務執行完,不給其它線程機會) 環境模擬:假設車站的車票開放給三個票販子賣 class MyTh

JavaScript基礎概念之----面向象----理解

描述符 對象實例 set 自定義 配置 cti 循環 自定義對象 enum 創建自定義對象最簡單的方式是創建一個Object的實例: var person = new Object() person.name = ‘adhehe‘ person.age = 23 per

String物件常量池特性synchronized物件的影響

一 .什麼是String的常量池特性  對於字串物件有兩種建立方法,如下: 直接賦值法: String str1="直接賦值建立字串";  建立物件法: String str2=new String("建立物件來建立字串");  第一種方法是直接建

Jdk1.6及以上版本synchronized的優化

目錄 1. 概述 2. 實現同步的基礎 3. 實現方式 Java物件頭(儲存鎖型別) 優化後synchronized鎖的分類 鎖的升級(進化) 偏向鎖 偏向鎖的加鎖 偏向鎖的撤銷 總結 輕量級鎖

Java 虛擬機器 synchronized 鎖的優化

一、volatile 與 synchronized 關鍵字 的原理         Java程式碼首先會被編譯成位元組碼檔案。位元組碼檔案被載入到JVM中,JVM將位元組碼翻譯成彙編指令,從而在CPU中執行。         談到volatile關鍵字,就會想到兩點:

think5service理解

mvc框架由model,view,controller組成,執行流程一般是:在controller訪問model獲取資料,通過view渲染頁面。 mvc模式是web開發中的基礎模式,採用的是分層設計,各層之間職責分明。然而事與願違,當我們日積月累的基於mvc模式開發之後,會

Java6中synchronized的優化

目錄 1. 概述 在多執行緒併發程式設計中synchronized一直是元老級角色, 很多人都會稱呼它為重量級鎖. 但是, 隨著Java SE 1.6對synchronized進行了各種優化之後, 有些情況下它就並不那麼重了. 本文詳細介紹Java SE 1.6中為了減少獲得鎖和釋放鎖帶來的效能消耗而引入的

嵌入式C語言的位元組理解(圖文)

 1.位元組對齊?            對齊跟資料在記憶體中的位置有關。如果一個變數的記憶體地址正好位於系統長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設一個整型變數的地址為0x00000004,那它就是自然對齊的。  2. 計算機為什麼要對齊?   需

Synchronized理解

  下面這篇部落格我看講的還算是挺細的,能夠結合具體例項來說明,部落格地址為:http://www.cnblogs.com/QQParadise/articles/5059824.html   在Java中,synchronized關鍵字是用來控制執行緒同步的,就是在多執行緒

RESTFUL理解

目前都在提倡RESTful風格的API,RESTful架構,那到底什麼是RESTful?什麼是RESTful風格。在這寫出自己對REST的理解。 REST最早出自一個計算機大牛(主導設計了HTTP協議1.1和1.0版,目前HTTP都有HTTP2了),指的是表述

149 Oracle數據庫SQL開發之 大象——理解LONG和LONG RAW類型

對象 inb rac con user his -s pac petty 149.Oracle數據庫SQL開發之 大對象——理解LONG和LONG RAW類型 歡迎轉載,轉載請標明出處:http://blog.csdn.net/notbaron/article/detai

系統技術非業餘研究 » 實驗Erlang語法對應的opcode 讓你erlang理解更深

Erlang作為一門FP語言,和傳統的語言結構一樣, 有模組, 有函式, 有語句, 有判斷, 有迴圈, 還有特別的模式匹配。 那麼這些在底層是如何運作的。 我在底下給大家做個簡單的實驗,讓大家一窺內部的細節,讓大家寫碼的時候知道個大概。 erlang的VM作為register based的VM,

執行緒程序形象理解

程序與執行緒的一個簡單解釋 程序(process)和執行緒(thread)是作業系統的基本概念,但是它們比較抽象,不容易掌握。 最近,我讀到一篇材料,發現有一個很好的類比,可以把它們解釋地清晰易懂。 1. 計算機的核心是CPU,它承擔了所有的計算任務。它就像一座工廠,

linux理解之alsa一

------------------------------------------ 本文系本站原創,歡迎轉載! ------------------------------------------ 我們以imx51為平臺,去分析alsa的架構。 有兩個檔案跟平臺具體相關的: 一個是跟cpu的音

jdk1.6以後 synchronized鎖做了哪些優化

1.適應自旋鎖    自旋鎖:為了減少執行緒狀態改變帶來的消耗 不停地執行當前執行緒  2.鎖消除:   不可能存在共享資料競爭的鎖進行消除 3.鎖粗化:   將連續的加鎖 精簡到只加一次鎖 4.輕量級鎖:  無競爭條件下 通過CAS消除同步互斥 5.偏向鎖: 無競