什麼是鎖?
- 鎖是用來控制多個線程訪問共享資源的方式,一般來說,一個鎖能夠防止多個線程同時訪問共享的資源。
爲什麼要用鎖?
-
先來看下鎖定義裏爲什麼要使用多線程呢?
現在計算機基本都是多核,如果是單線程,會浪費其它覈資源,所以採用多線程。 -
多線程是併發編程的產物,可以提高系統吞吐量,但是也會導致數據不一致問題。
例如 :
進行i++運算,多個核如果同時進行,數據會不一致。
再例如:
java中的Servlet容器,是多線程的,所以也會有線程安全問題,造成數據不一致。
如果還不理解,引出一個真實場景,多窗口賣票(多線程操作同一個共享資源),如果不加處理就會引起超賣等數據不一致情況。 -
引出鎖 所以引出鎖就是爲了解決這種情況數據不一致問題。
熟悉的都有那些鎖?
- Synchronized,volatile,Lock
熟悉的鎖的分類?
1,樂觀鎖/悲觀鎖
**悲觀鎖:**併發下,數據操作一定會出錯,所以用Synchronized,volatile,Lock等方法同步執行(類似DB的行級鎖)。
(能保證數據肯定是正確的,但是這樣性能就降下來了,那有什麼辦法,既能不降低性能又能數據操作正確嗎,看下樂觀鎖吧)
樂觀鎖:併發下,數據操作一定不會出錯,所以基本是無鎖編程(CAS算法)(這樣性能是沒有影響,但是數據出錯就不管了?)
樂觀鎖一般採取最常用的版本控制來出錯的數據,會吧數據更新錯誤進行處理。
2,來看下CAS算法。
兩種方案根據試試場景選擇使用。
鎖應用場景實例分析?
多窗口賣票
未完更新。。。。