最近在面試中遇到很多關於多執行緒的問題,特別是鎖的應用,現在我就來說說類鎖和物件鎖。
物件鎖(synchronized method{})和類鎖(static sychronized method{})的區別
物件鎖也叫例項鎖,對應synchronized關鍵字,當多個執行緒訪問多個例項時,它們互不干擾,每個物件都擁有自己的鎖,如果是單例模式下,那麼就是變成和類鎖一樣的功能。
物件鎖防止在同乙個時刻多個執行緒訪問同乙個物件的synchronized塊。如果不是同乙個物件就沒有這樣子的限制。
類鎖對應的關鍵字是static sychronized,是乙個全域性鎖,無論多少個物件否共享同乙個鎖(也可以鎖定在該類的class上或者是classloader物件上),同樣是保障同乙個時刻多個執行緒同時訪問同乙個synchronized塊,當乙個執行緒在訪問時,其他的執行緒等待。
**樣例
我們就拿賬戶存錢取錢的情景來模擬,以下是使用物件鎖
account類
public class account
public synchronized void mul(int m)
}
main類
public static void main(string args) catch (exception e)
}},"執行緒"+i).start();
}
使用cyclicbarrier類讓四個子執行緒都準備好了之後就開始對賬戶進行操作,1、3執行緒執行新增,2、4執行減少
可以看到結果,執行緒的執行不是同步的,而是非同步的,所以如果想要用物件鎖進行同步操作,就必須鎖定同乙個物件
接著繼續看類鎖,當多個執行緒執行同乙個物件的加減操作時
public class account
public static synchronized void mul(int m)
}
執行結果
從結果中也可以看出執行是同步操作的,如果同上面物件鎖一樣是多個執行緒訪問多個物件操作加減方法,執行結果如下
從結果中仍然可以看出,類鎖無論是訪問同乙個物件的synchronized塊還是多個物件的,仍然是同步操作的。
總結:
1.類鎖是對靜態方法使用synchronized關鍵字後,無論是多執行緒訪問單個物件還是多個物件的sychronized塊,都是同步的。
2.物件鎖是例項方法使用synchronized關鍵字後,如果是多個執行緒訪問同個物件的sychronized塊,才是同步的,但是訪問不同物件的話就是不同步的。
3.類鎖和物件鎖是兩種不同的鎖,可以同時使用,但是注意類鎖不要巢狀使用,這樣子容易發生死鎖。
類鎖和物件鎖兩種使用的方式
類鎖1.**塊的方式
public void add(int m)
}
2.方法鎖方式
public static synchronized void add(int m)
物件鎖
1.**塊的方式
public void add(int m)
}
2.方法鎖的方式
public synchronized void add(int m)
今天的分享就到這裡
類鎖和物件鎖
物件鎖 當乙個物件中有synchronized method或synchronized block的時候呼叫此物件的同步方法或進入其同步區域時,就必須先獲得物件鎖。如果此物件的物件鎖已被其他呼叫者占用,則需要等待此鎖被釋放 同步靜態方法 靜態變數互斥體 由於乙個class不論被例項化多少次,其中的靜...
類鎖和物件鎖
類鎖 和 物件鎖 1.類鎖 先定義這麼乙個類 classt synchronized static methoda 那麼 例項化兩個物件之後 classt a classt b 在這兩個物件呼叫methoda時,第乙個呼叫的會得到classt類的類鎖,第二個呼叫的要等到第乙個呼叫結束後釋放鎖,才能完...
java的物件鎖和類鎖
類鎖 在 中的方法上加了static和synchronized的鎖,或者synchronized class 物件鎖 在 中的方法上加了synchronized的鎖,或者synchronized this 的 段 方法鎖和私有鎖 都屬於物件鎖 私有鎖 在類內部宣告乙個私有屬性如private obj...