1.什么是synchronized?
Synchronized是Java關(guān)鍵字,是一種同步鎖。
可以理解為:當(dāng)一個(gè)方法等使用這個(gè)關(guān)鍵字修飾時(shí),同一時(shí)刻只能存在一個(gè)線程執(zhí)行被修飾的代碼,如果存在其他線程也需要執(zhí)行這個(gè)被修飾的代碼,那么其他線程必須等待當(dāng)前線程執(zhí)行完成被修飾的代碼后才能執(zhí)行該被修飾的代碼。
注意:當(dāng)一個(gè)線程訪問對(duì)象的一個(gè)加鎖代碼塊時(shí),另一個(gè)線程仍可以訪問該對(duì)象中的非加鎖代碼塊。
2.synchronized可以修飾哪些對(duì)象以及如何使用?
synchronized可以修飾對(duì)象一般為以下幾種:
(1)修飾代碼塊
????????a.被修飾的代碼塊稱為同步語句塊
????????b.作用范圍:synchronized修飾的大括號(hào)中的代碼
? ? ? ? c.作用對(duì)象:調(diào)用這個(gè)代碼塊的所有對(duì)象
? ? ? ? d.示例:
? ? ? ? ? ? ? ? public void method(int i){
? ??????????????????synchronized(this){
? ? ? ? ? ? ? ? ? ? ? ? i++;
????????????????????}
????????????????}
(2)修飾方法
????????a.普通方法
? ? ? ? ? ? (a)被修飾的方法叫做同步方法
? ? ? ? ? ? (b)作用范圍:被修飾的整個(gè)方法
? ? ? ? ? ? (c)作用對(duì)象:調(diào)用這個(gè)被修飾方法的對(duì)象
? ? ? ? ? ? (d)示例:
? ? ? ? ? ? ? ? ? ? public synchronized void method(int i){
????????????????????????????i++;
????????????????????}
????????b.靜態(tài)方法
????????????(a)被修飾的靜態(tài)方法叫做同步靜態(tài)方法
????????????(b)作用范圍:被修飾的整個(gè)靜態(tài)方法
????????????(c)作用對(duì)象:被修飾方法所屬類的所有對(duì)象(存在線程在該類進(jìn)行操作時(shí),其他線程在該類的所有對(duì)象上的操作都不能進(jìn)行)
? ? ? ? ? ? (d)示例:
? ??????????????????public static synchronized void method(int i){
????????????????????????i++;
????????????????????}
(3)修飾類
? ? ? ? a.被修飾的類叫做同步類
? ? ? ? b.作用范圍:被關(guān)鍵字修飾的后面大括號(hào)中的代碼
? ? ? ? c.作用對(duì)象:被修飾類的所有對(duì)象
? ? ? ? d.示例:
? ? ? ? ? ? public? class ClassName {
????????????????? public void method() {
? ? ? ????????????????synchronized(ClassName.class) {
? ? ? ? ? ? ? ? ? ? ? ?}
????????????????? }
????????????}