1. 程式人生 > 其它 >JavaScript 閉包!

JavaScript 閉包!

synchronized是Java中的關鍵字,是一種同步鎖。它修飾的物件有以下幾種:

  1. 修飾一個程式碼塊,被修飾的程式碼塊稱為同步語句塊,其作用的範圍是大括號{}括起來的程式碼,作用的物件是呼叫這個程式碼塊的物件;一個執行緒訪問一個物件中的synchronized(this)同步程式碼塊時,其他試圖訪問該物件的執行緒將被阻塞。


  2. 修飾一個方法,被修飾的方法稱為同步方法,其作用的範圍是整個方法,作用的物件是呼叫這個方法的物件;當一個執行緒訪問物件的一個synchronized(this)同步程式碼塊時,另一個執行緒仍然可以訪問該物件中的非synchronized(this)同步程式碼塊。

  多個執行緒訪問synchronized和非synchronized程式碼塊,Synchronized修飾一個方法很簡單,就是在方法的前面加synchronized,public synchronized void method(){}; synchronized修飾方法和修飾一個程式碼塊類似,只是作用範圍不一樣,修飾程式碼塊是大括號括起來的範圍,而修飾方法範圍是整個函式。


  3. 修改一個靜態的方法,其作用的範圍是整個靜態方法,作用的物件是這個類的所有物件;Synchronized也可修飾一個靜態方法,用法如下:

public synchronized static void method() {}

我們知道靜態方法是屬於類的而不屬於物件的。同樣的,synchronized修飾的靜態方法鎖定的是這個類的所有物件。

4. 修改一個類,其作用的範圍是synchronized後面括號括起來的部分,作用主的物件是這個類的所有物件。synchronized作用於一個類T時,是給這個類T加鎖,T的所有物件用的是同一把鎖。

總結一下就是;

1、無論synchronized關鍵字加在方法上還是物件上,如果它作用的物件是非靜態的,則它取得的鎖是物件;如果synchronized作用的物件是一個靜態方法或一個類,則它取得的鎖是對類,該類所有的物件同一把鎖。
2、每個物件只有一個鎖(lock)與之相關聯,誰拿到這個鎖誰就可以執行它所控制的那段程式碼。


3、實現同步是要很大的系統開銷作為代價的,甚至可能造成死鎖,所以儘量避免無謂的同步控制