多執行緒之synchronized同步語句塊(1)

2021-10-05 17:43:09 字數 4166 閱讀 5707

用關鍵字synchronized宣告方法在某些情況下是有弊端的,比如a執行緒呼叫公布方法執行乙個長時間的任務,那麼b執行緒則必須等待比較長時間。在這樣的情況下可以使用synchronized同步語句塊來解決。

我們來證明一下synchronized關鍵字宣告方法是有弊端的。

**示例:

方法類:

package test;

/** * @author libinquan

*/public

class

task

catch

(interruptedexception e)

}}

工具類:

package test;

/** * @author libinquan

*/public

class

commonutils

執行緒1:

package test;

/** * @author libinquan

*/public

class

threadtest1

extends

thread

@override

public

void

run(

)}

執行緒2:

package test;

/** * @author libinquan

*/public

class

threadtest2

extends

thread

@override

public

void

run(

)}

執行類:

package test;

/** * @author libinquan

*/public

class

runcatch

(interruptedexception e)

long begintime = commonutils.begintime1;

if(commonutils.begintime2 < commonutils.begintime1)

long endtime = commonutils.endtime1;

if(commonutils.endtime2 < commonutils.endtime1)

system.out.

println

("耗時:"

+(endtime - begintime)

/1000);

}}

輸出:

在使用synchronized關鍵字倆宣告方法 public synchronized void dolongtimetask()時從執行的時間上來看,弊端很明顯,解決這樣的問題可以使用synchronized同步塊。

當兩個併發執行緒訪問同乙個物件object中的synchronized(this)同步**塊時,一段時間內只能有乙個執行緒被執行,另乙個執行緒必須等待當前執行緒執行完這個**塊以後才能執行該**塊。

示例**:

方法類:

package test;

/** * @author libinquan

*/public

class

objectservice

}catch

(interruptedexception e)

}}

執行緒1:

package test;

/** * @author libinquan

*/public

class

threadtest1

extends

thread

@override

public

void

run(

)}

執行緒2:

package test;

/** * @author libinquan

*/public

class

threadtest2

extends

thread

@override

public

void

run(

)}

執行類:

package test;

/** * @author libinquan

*/public

class

run}

輸出:

雖然這個示例中我們使用了synchronized同步**塊,但執行的效率還是沒有提高,執行的效果還是同步執行的。

這邊修改一下 上面的方法就行,**如下:

package test;

/** * @author libinquan

*/public

class

task

system.out.

println

(getdata1)

; system.out.

println

(getdata2)

; system.out.

println

("end");

}catch

(interruptedexception e)

}}

輸出:

通過上面的測試可以得知,當乙個執行緒訪問object的乙個synchronized同步**塊時,另乙個執行緒仍然可以訪問該object物件中的非synchronized(this)同步**塊。

這邊我們可以看到執行時間縮短但是同步synchronized**塊真的是同步的嗎?真的持有當前呼叫物件的鎖嗎?答案為:是 ,這邊我們就需要驗證一下。

這邊我們要證明一點:不在synchronized塊中就是非同步執行,在synchronized塊中就是同步執行。

方法類:

package test;

/** * @author libinquan

*/public

class

task

synchronized

(this)}

}}

執行緒1:

package test;

/** * @author libinquan

*/public

class

threadtest1

extends

thread

@override

public

void

run(

)}

執行緒2:

package test;

/** * @author libinquan

*/public

class

threadtest2

extends

thread

@override

public

void

run(

)}

執行類:

package test;

/** * @author libinquan

*/public

class

run}

輸出:

非同步**塊交叉列印

同步**塊排隊執行

多執行緒同步 synchronize

在專案中我們經常遇到這樣一種情況 兩個人同時運算元據庫,導致資料異常。針對於資料庫級別我們採用鎖機制,還有一種方法使規定我們方法呼叫的許可權,當你在使用這個資源的時候別人是不允許使用的,在多執行緒中只需要乙個修飾詞就可以實現 synchronize。第一步 下面我們採用銀行取錢的場景來 實現 acc...

Java 多執行緒同步 synchronized

在多執行緒程式設計環境下,對於共享資源 比如多執行緒共享的變數 的寫操作時,不同執行緒之間假如沒有相互同步,而是隨機讀取 更改變數回寫到記憶體中,就會出現混亂和錯誤!因此必須要在多執行緒的操作方法上新增鎖物件,當乙個執行緒進入操作的時候,其它執行緒必須要等待,這樣依次序列完成任務。synchroni...

多執行緒 Synchronize實現原理

前言 synchronize實現實現同步最常用的方式,但是它的底層實現呢?如何實現 通過synchronize修飾的 塊,執行緒訪問需要申請鎖才能訪問,但是當乙個物件的鎖已經被乙個執行緒拿到了,其他執行緒就拿不到這個物件的鎖,必須進入等待阻塞的狀態。monitor物件,在同步 塊的開始會引入moni...