Java同步機制的應用

2021-04-20 18:26:39 字數 1372 閱讀 4415

基本概念:

每個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 執行緒同步機制

執行緒安全問題 當多個執行緒共享一批資料時,則會出現執行緒安全問題,看個demo 三個執行緒 同時賣100張票,此時執行則會出現執行緒安全問題,執行結果可能會出現賣重複的張數,或者賣不出現的張數。public class runnable2 implements runnable catch int...

linux同步機制

一.併發控制 1 自旋鎖 得不到資源,會原地打轉,直到獲得資源為止 定義自旋鎖 spinlock t spin 初始化自旋鎖 spin lock init lock 獲得自旋鎖 spin lock lock 獲得自旋鎖,如果能立即獲得,則馬上返回,否則自旋在那裡,直到該自旋鎖的保持者釋放 spin ...

MySQL 同步機制

innodb沒有使用作業系統同步機制,而是自己封裝,通過spin 自旋 和wait array 等待佇列 的設計提高效能 目前的cpu都支援tas指令。該指令通過讀取乙個位元組或者乙個word,然後和0比較,並且無條件的將其在記憶體中的值設為1,是原子操作。用到swap atomic操作,將記憶體中...