在使用synchronized的時候,我們有時只是希望防止多個線程同時訪問方法內部的部分代碼而不是防止其訪問整個方法,通過這種方式分離出來的代碼我們成爲臨界區(critical section),如下列代碼所示:
public void test(){ synchronized (this){ //代碼塊 } }這也被稱爲同步控制塊,需要注意的是使用同步控制塊要比使用同步方法的性能要好,所以我們需要根據實際的場景來衡量。
另外我們需要注意的是synchronized(this)表示的鎖是自身對象,而synchronized(class)表示的鎖是這個類,意思就是這個同步代碼塊同一時間只能有一個線程執行,不管你是不是同一個實例對象。我們再來看下列代碼:
public class Haha { public int i = 10; private Integer x =10; public void test(){ synchronized(x){ //代碼塊 } } public synchronized void text(){ } }這個類中的test方法的鎖是自身對象的成員屬性x,而text方法的鎖是自身對象,也就是說他們的同步都是在haha對象但是不同的鎖上,所以這兩個方法是獨立的,並不會阻塞。