基本概念:
每個object都會有1個鎖.
同步就是序列使用一些資源.
(說明:以下有些例子為了突出重點,省略了不必要的**.特別是省掉了一些成員變數,就是需要同步的物件.)
1. 多執行緒中對共享、可變的資料進行同步.
對於函式中的區域性變數沒必要進行同步.
對於不可變資料,也沒必要進行同步.
多執行緒中訪問共享可變資料才有必要.
2. 單個執行緒中可以使用synchronized,而且可以巢狀,但無意義.
class test }}
}3. 物件例項的鎖
class test
public void f2()}}
上面的f1()和f2()效果一致, synchronized取得的鎖都是test某個實列(this)的鎖.
比如: test t = new test();
執行緒a呼叫t.f2()時, 執行緒b無法進入t.f1(),直到t.f2()結束.
作用: 多執行緒中訪問test的同乙個例項的同步方法時會進行同步.
4. class的鎖
class test
public static void f2()
}public static void f3()
}catch (classnotfoundexception ex)
}public static void g()}}
上面f1(),f2(),f3(),g()效果一致
f1(),f2(),f3()中synchronized取得的鎖都是test.class的鎖.
g()是自己產生乙個物件o,利用o的鎖做同步
作用: 多執行緒中訪問此類或此類任乙個例項的同步方法時都會同步. singleton模式lazily initializing屬於此類.
5. static method
class test
public synchronized static void f2()
}多執行緒中使用test的某個實列時,
(1) f1()是執行緒安全的,不需要同步
(2) f2()這個靜態方法中使用了函式外靜態變數,所以需要同步.
6. 對執行緒的run()進行同步沒有意義,如 public synchronized void run()
class test extends thread
}public synchronized void f()
}這種例子會有乙個問題, 執行run()時(內部在迴圈), 外部無法執行f()
class test extends thread
}這種例子同步基本沒用, 因為run()通常靠 new test().start()來執行的.
因為test例項不同,鎖也不同.
對java中static的一些理解
一 static成員變數和非static成員變數的區別 1 記憶體中的位置不同 ststic的成員變數存放在全域性變數區,只有乙份。非static的成員變數在物件例項化時隨著物件儲存在堆中,每個物件都有特定的乙個。2 使用方法 static成員變數既可以被類名呼叫也可以被物件呼叫,非static成員...
Linux 同步的一些理解
1 只要沒有執行緒持有某個給定的讀寫鎖用於寫,那麼任意數目的執行緒可以持有該讀寫鎖用於讀。2 僅當沒有執行緒持有該給定的讀寫鎖用於讀或者寫時,才能分配該讀寫鎖用於寫 這種對於給定的某個資源的共享訪問稱為 共享 獨佔上鎖。獲取乙個讀寫鎖用於讀稱為共享鎖,獲取乙個讀寫鎖用於寫稱為獨佔鎖。讀寫鎖的資料型別...
對Linux inode的一些理解
檔名 inode device block 一 inode是什麼?理解inode,要從檔案儲存說起。檔案儲存在硬碟上,硬碟的最小儲存單位叫做 扇區 sector 每個扇區儲存512位元組 相當於0.5kb 作業系統讀取硬碟的時候,不會乙個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次...