基本概念:
每個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操作,將記憶體中...