用關鍵字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...