1. 把synchronized當作函數修飾符時
Public synchronized void methodAAA()
{
//….
}
它等同於
public void methodAAA()
{
synchronized (this) // (1)
{
//…..
}
}
它鎖定的是調用這個同步方法對象
2.同步塊,範例程式碼如下:
public void method3(SomeObject so)
{
synchronized(so)
{
//…..
}
}
當有一個明確的對象作為鎖時,就可以這樣寫程式,但當沒有明確的對象作為鎖,只是想讓一段代碼同步時,可以建立一個特殊的instance變數(它得是一個對象)來充當鎖:
class Foo implements Runnable
{
private byte[] lock = new byte[0]; // 特殊的instance變數
Public void methodA()
{
synchronized(lock) { //… }
}
//…..
}
註:零長度的byte數組對象建立起來將比任何對象都經濟――查看編譯後的位元組碼:產生零長度的byte[]對象只需3條作業碼,而 Object lock = new Object()則需要7行作業碼。
3.將synchronized作用於static 函數,範例程式碼如下:
Class Foo
{
public synchronized static void methodAAA() // 同步的static 函數
{
//….
}
public void methodBBB()
{
synchronized(Foo.class) // class literal(類名稱字面常量)
}
}
代碼中的methodBBB()方法是把class literal作為鎖的情況,它和同步的static函數產生的效果是一樣的,取得的鎖很特別,是當前調用這個方法的對象所屬的類(Class,而不再是由這個Class產生的某個具體對象了)。