<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [toc] 提幾個問題: - synchronized保證原子性,volatile保證可見性; - 不用volatile,只用synchronized修飾,能保證可見性嗎? ## 隊列同步器AQS 隊列同步器AbstractQueuedSynchronizer(以下簡稱同步器),是用來構建鎖或者其他同步組件的基礎框架。 使用同步器提供的3個方法(getState()、setState(int newState)和compareAndSetState(int expect,int update))來進行操作,因為它們能夠保證狀態的改變是安全的。 ### 同步器實現原理 同步器依賴內部的同步隊列(一個FIFO雙向隊列)來完成同步狀態的管理,當前線程獲取同步狀態失敗時,同步器會將`當前線程`以及`等待狀態`等信息構造成為一個`節點(Node)`并將其加入同步隊列,同時會阻塞當前線程;當同步狀態釋放時,會把首節點中的線程喚醒,使其再次嘗試獲取同步狀態。 `設置尾結點`:通過CAS實現。 `設置頭結點`:設置首節點是通過獲取同步狀態成功的線程來完成的,由于只有一個線程能夠成功獲取到同步狀態,因此設置頭節點的方法并不需要使用CAS來保證,它只需要將首節點設置成為原首節點的后繼節點并斷開原首節點的next引用即可。 ### 獨占式同步狀態獲取流程 ![](https://img.kancloud.cn/3a/40/3a402a050e9412968653c0e31e2bd325_638x684.png) 1. 在**獲取同步狀態**時,同步器維護一個同步隊列,獲取狀態失敗的線程都會被加入到隊列中并在隊列中進行自旋; 2. **移出隊列**(或停止自旋)的條件是前驅節點為頭節點且成功獲取了同步狀態。 3. 在**釋放同步狀態**時,同步器調用tryRelease(int arg)方法釋放同步狀態,然后喚醒頭節點的后繼節點。 ## 悲觀鎖 ### synchronized - 鎖功能的實現:synchronized是通過監視器實現鎖功能的。隨著jdk版本的升級,synchronized性能不斷提升,分為偏向鎖、輕量鎖、重量鎖等。 - 線程喚醒:不能喚醒指定線程。 阻塞方法:wait() ### ReentrantLock - ReentrantLock是對象鎖,使用時需要`new ReentrantLock()`,線程獨享,可以喚醒指定線程。 - 阻塞方法:需要用到Condition對象,調用`condition.wait()`方法。 > ReentrantLock是基于CAS實現的悲觀鎖,從宏觀上講它是悲觀鎖,從微觀上講,它是基于樂觀鎖實現的。 ## 樂觀鎖CAS - 無線程切換 - 阻塞方法:LockSupport.park() - 解鎖方法:LockSupport.unpark(線程名稱) #### Condition對象 每個Condition對象都包含一個隊列——**等待隊列**,該隊列是實現`等待/通知`功能的關鍵。 ![](https://img.kancloud.cn/86/d7/86d7f2edaa1efc73f988598c71b0718a_1171x369.png) Condition對象擁有等待隊列首尾對象的引用。 ### LockSupport
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看