**鎖有哪些?**
悲觀鎖,樂觀鎖,獨占鎖,共享鎖,公平鎖,非公平鎖,分布式鎖,自旋鎖
**講講樂觀鎖悲觀鎖?**
就說mysql吧,悲觀鎖,主要是表鎖,行鎖還有間隙鎖,葉鎖,讀鎖,因為這些鎖在被觸發的時候勢必引起線程阻塞,所以叫悲觀
另外樂觀鎖其實在mysql本身中不存在的,但是mysql提供了種mvcc的機制,支持樂觀鎖機制,
**mvcc**
只是在innodb引擎下存在,mvcc是為了滿足事務的隔離,通過版本號的方式,避免同一數據不同事務間的競爭,所說的樂觀鎖只在事務級別為讀未提交讀提交,才會生效,
**具體mvcc機制有什么?**
多版本并發控制,保證數據操作在多線程過程中,保證事務隔離的機制,可以降低鎖競爭的壓力,保證比較高并發量,這個過程。在每開啟一個事務時,會生成一個事務的版本號,被操作的數據會生成一條新的數據行(臨時),但是在提交前對其他事務是不可見的,對于數據的更新操作成功,會將這個版本號更新到數據的行中,事務提交成功,將新的版本號,更新到此數據行(永久)中,這樣保證了每個事務操作的數據,都是相互不影響的,也不存在鎖的問題;
**那么在多個事務(操作同一條數據)并發過程中,誰先成功?**
mysql判斷,其實就是誰先提交成功算誰的
**聊聊事務**
事務常說一系列操作作為一個整體要么都成功要么都失敗,主要特性acid,事務的的實現主要依賴兩個log redo-log,undo-log,每次事務都會記錄數據修改前的數據undo-log,修改后的數據放入redo-log,提出成功則使用redo-log 更新到磁盤,失敗則使用undo-log將數據恢復到事務之前的數據
**說說獨占鎖,共享鎖吧**
(嗯,獨占,共享,公平,非公平,自旋鎖這些都是廣泛的概念,很多語言都有,包括操作系統,js的同學請回避)
獨占鎖很明顯就是持鎖的線程只能有一個,共享鎖則可以有多個
**獨占可以理解,共享的意義在哪里?**
共享鎖是為了提高程序的效率,舉個例子數據的操作有讀寫之分,對于寫的操作加鎖,保證數據正確性,而對于讀的操作如果不加鎖,在寫讀操作同時進行時,讀的數據有可能不是最新數據,如果對讀操作加獨占鎖,面對讀多寫少的程序肯定效率很低,所有就出現了共享鎖,對于讀的的操作就使用共享的概念,但是對于寫的操作則是互斥的,保證了讀寫的數據操作都一致,在java中上述的鎖叫讀寫鎖
**讀寫鎖的機制是什么呢?**
在java中讀寫鎖(ReadWritelock)的機制是基于AQS的一種實現,保證讀讀共享,讀寫互斥,寫寫互斥,如果要說機制的話,還要從AQS說起,這是java實現的一種鎖機制,互斥鎖,讀者寫鎖,條件產量,信號量,柵欄的都是它的衍生物,主要工作基于CHL隊列,voliate關鍵字修飾的狀態符stat,線程去修改狀態符成功了就是獲取成功,失敗了就進隊列等待,等待喚醒,AQS中還有很重要的一個概念是自旋,在等待喚醒的時候,很多時候會使用自旋(while(!cas()))的方式,不停的嘗試獲取鎖,直到被其他線程獲取成功
共享與獨占的區別就在于,CHL隊列中的節點的模式是EXCLUSIVE還是SHARED,當一個線程成功修改了stat狀態,表示獲取了鎖,如果線程所在的節點為SHARED,將開始一個讀鎖傳遞的過程,從頭結點,向隊列后續節點傳遞喚醒,直到隊列結束或者遇到了EXCLUSIVE的節點,等待所有激活的讀操作完成,然后進入到獨享模式(這部分盡力了,大家還是看源碼)
公平與非公平的區別就在于線程第一次獲取鎖時,也就是執行修改stat操作時,是進隊列還是直接修改狀態,這是基本的工作機制
**java 除了AQS 還有其他的鎖支持么?**
在java中,synchronized關鍵字,是語言自帶的,也叫內置鎖,synchronized關鍵字,我們都知道被synchronized修飾的方法或者代碼塊,在同一時間內,只允許一個線程執行,是明顯的獨享鎖,synchronized的實現機制?可以參考AQS的實現方式,只是AQS使用顯示的用lock.lock()調用,而sync作為關鍵字修飾,你可以認為在synchronized修飾的地方,自動添加了lock方法,結束的地方進行了unlock釋放鎖的方法,只是被隱藏了,我們看不到。
它本身實現有兩部分:monitor對象,線程,工作機制還是線程搶占對象使用權,對象都有自己的對象頭,存儲了對象的很多信息,其中有一個是標識被哪個線程持有,對比AQS,線程從修改stat,變為修改monitor的對象頭,線程的等待區域動 AQS中的隊列,變為monitor對象中的某個區域
鎖一直是圍繞線程安全來實現的,比如獨占鎖,它在內存里面的操作是怎么樣的
這個地方涉及到一個概念,內存模型(這個和jvm不要混淆,The Java memory model used internally in the JVM divides memory between thread stacks and the heap. This diagram illustrates the Java memory model from a logic perspective),是JVM用來區別線程棧和堆的內存方式,每個線程在運行的時候,所操作的數據存儲空間有兩個,一個是主內存 一個是工作內存,主內存其實就是jvm中堆,工作內存就是線程的棧,每次的數據操作,都是從主內存中把數據讀到工作內存中,然后在工作內存中進行各種處理,如果進行了修改,會把數據回寫到主內存,然后其他線程又進行同樣的操作,就這樣數據在工作內存和主內存,進進出出,不亦樂乎,在多次的情況下,就是因為進進出出的順序亂了,不是按照線程預期的訪問順序,就出現了數據不一致的問題,導致了多線程的不安全性;整個操作過程還牽涉到CPU,高速緩存等概念,略過。。。。
**內存模型 還有哪些可以聊聊的?**
happen-befor 原則,Volatile 關鍵字(線程的可見性),內存屏障
happen-befor原則定義了內存模型執行過程中的定律,就像1+1 = 2,不可能被打破的jvm的運行機制都依賴于這個原則,是jvm的憲法!!!
Volatile關鍵字就有點叼了,Volatile修飾的數據,在被某個線程修改后,會被及時的回寫到主內存,然后其他線程再獲取時,就是新的數據,聽起來很美好,但是Volatile沒有辦法控制線程的順序,當一個數據(新數據)即將被修改到主內存時,剛好,另外一個線程從主內存讀了數據(老數據),并又進行了一波操作,又將數據(更新的數據)回寫到了主內存,整個過程(新數據)完全沒有起到一毛錢作用,最終導致了數據的錯誤,呼呼打完收工!!!!



- 基礎
- 編譯和安裝
- scanner類(鍵盤錄入)
- Random類(隨機數)
- 數組
- 方法
- 類
- ArrayList集合
- char與int
- eclipse
- IDEA
- 變量與常量
- 常用API
- String,StringBuffer,StringBuilder
- 正則,Date,DateFormat,Calendar
- 包裝類,System,Math,Arrays,BigInteger,BigDecimal
- 集合,迭代器,增強for,泛型
- List,set,判斷集合唯一
- map,Entry,HashMap,Collections
- 異常
- IO
- File
- 遞歸
- 字節流
- 字符流
- IO流分類
- 轉換流
- 緩沖流
- 流的操作規律
- properties
- 序列化流與反序列化流
- 打印流
- commons-IO
- IO流總結
- 多線程
- 線程池
- 線程安全
- 線程同步
- 死鎖
- lock接口
- ThreadLoad
- 等待喚醒機制
- 線程狀態
- jdbc
- DBUtils
- 連接池DBCP
- c3p0連接池
- 網絡編程
- 多線程socket上傳圖片
- 反射
- xml
- 設計模式
- 裝飾器模式
- web service
- tomcat
- Servlet
- response
- request
- session和cookie
- JSP
- EL
- JSTL
- 事務
- 監聽器Listener
- 過濾器Filter
- json
- linux安裝軟件
- 反射詳解
- 類加載器和注解
- 動態代理
- jedis
- Hibernate
- 簡介
- 創建映射文件
- Hibernate核心配置文件
- 事務和增刪改查
- HibernateUtils
- 持久化對象的三種狀態
- 檢索方式
- query
- Criteria
- SQLQuery
- 持久化類
- 主鍵生成策略
- 緩存
- 事務管理
- 關系映射
- 注解
- 優化
- struts2
- 搭建
- 配置詳解
- Action
- 結果跳轉方式
- 訪問ServletAPI方式
- 如何獲得參數
- OGNL表達式
- valueStack 值棧
- Interceptor攔截器
- spring
- 導包
- IOC和DI
- Bean獲取與實例化
- Bean屬性注入
- spring注解
- 注解分層
- junit整合
- aop
- 動態代理實現
- cglib代理實現
- aop名詞
- spring的aop
- aop-xml詳解
- aop-注解詳解
- 代理方式選擇
- jdbcTemplate
- spring事務管理
- 回滾注意
- 事務傳播屬性
- MyBatis
- MyBatis簡介
- 入門程序
- 與jdbc hibernate不同
- 原始Dao開發
- Mapper動態代理方式
- SqlMapConfig.xml配置文件
- 輸入參數pojo包裝類
- resultMap
- 動態sql
- 一對一關聯
- 一對多
- 整合spring
- 逆向工程
- maven
- maven簡介
- 倉庫
- maven目錄結構
- maven常用命令
- 生命周期
- eclipse中maven插件
- 入門程序
- 整合struct
- 依賴范圍
- 添加插件
- idea配置
- jar包沖突
- 分模塊開發
- 構建可執行的jar包(包含依賴jar包)
- springMVC
- 處理流程
- java面試
- java版本升級
- java1-8版本變更
- java9新特性
- 鎖
- java資料
- idea
- jdk版本切換
- log4j
- 入門實例
- 基本使用方法
- Web中使用Log4j
- spring中使用log4j
- java代碼優化