對Java同步一些理解

2021-05-26 15:37:17 字數 1368 閱讀 2553

基本概念:

每個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 作業系統讀取硬碟的時候,不會乙個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次...