<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 鎖和監視器之間的區別 – Java 并發 > 原文: [https://howtodoinjava.com/java/multi-threading/multithreading-difference-between-lock-and-monitor/](https://howtodoinjava.com/java/multi-threading/multithreading-difference-between-lock-and-monitor/) 您可能在面試中遇到了這個問題,鎖和監視器之間的**有什么區別**? 好吧,要回答這個問題,您必須對 Java 多線程如何在后臺工作有足夠的了解。 答案很簡單,鎖為實現監視器提供了必要的支持。 長答案在下面閱讀。 ## 鎖 **鎖是一種數據,在邏輯上是堆內存中對象標頭的一部分**。JVM 中的每個對象都具有此鎖(或互斥鎖),任何程序均可使用該鎖來協調對該對象的多線程訪問。 如果有任何線程想要訪問該對象的實例變量; 那么線程必須“擁有”對象的鎖(在鎖存儲區域中設置一些標志)。 嘗試訪問該對象變量的所有其他線程必須等待,直到擁有該線程的線程釋放該對象的鎖(取消設置標志)。 線程擁有鎖后,它可以多次請求相同的鎖,但是在將鎖提供給其他線程之前,必須釋放相同的次數。 例如,如果一個線程請求了三次鎖定,則該線程將繼續擁有該鎖定,直到它“釋放”了三次。 請注意,當線程明確要求鎖時,它是由線程獲得的。 在 Java 中,這是通過`synced`關鍵字或`wait`和`notify`完成的。 ## 監視器 **監視器是一個同步構造,它允許線程具有互斥(使用鎖)和協作**,即使線程能夠等待某些條件成立的能力(使用`wait-set`) 。 換句話說,每個 Java 對象與實現鎖的數據在邏輯上均與實現`wait-set`的數據相關聯。 鎖可以幫助線程在共享數據上獨立工作而不會互相干擾,而等待集可以幫助線程相互協作以共同努力實現一個共同的目標,例如所有等待線程都將移至該等待集,一旦釋放鎖定,所有通知線程都將得到通知。 **此等待集通過鎖定(mutex)的附加幫助來幫助構建監視器**。 #### 互斥 簡單來說,監視器就像一棟建筑物,其中包含一個特殊的房間(對象實例),一次只能占用一個線程。 房間中通常包含一些數據,需要保護這些數據以防止并發訪問。 從線程進入該房間的時間到它離開的時間,它可以獨占訪問該房間中的任何數據。 進入顯示器大樓稱為“進入顯示器”。 進入建筑物內的特別房間稱為“獲取顯示器”。 占領房間稱為“擁有顯示器”,離開房間稱為“釋放顯示器”。 離開整個建筑物稱為“退出監視器”。 當線程到達以訪問受保護的數據(進入特殊房間)時,首先將其放入建筑物接收隊列中(條目集)。 如果沒有其他線程在等待(監視器擁有),則該線程獲取鎖并繼續執行受保護的代碼。 線程完成執行后,它將釋放鎖并退出建筑物(退出監視器)。 如果一個線程到達并且另一個線程已經擁有監視器,則它必須在接收隊列中等待(條目集)。 當前所有者退出監視器時,新到達的線程必須與也在入口集中等待的任何其他線程競爭。 只有一個線程會贏得比賽并擁有鎖。 **沒有等待設置特性。** #### 合作 通常,互斥僅在多個線程共享數據或其他資源時才重要。 如果兩個線程無法使用任何通用數據或資源,則它們通常不會互相干擾,也不必以互斥的方式執行。 互斥有助于防止線程在共享數據時相互干擾,而協作則可以幫助線程共同努力實現某個共同目標。 **當一個線程需要某些數據處于特定狀態而另一個線程負責使數據進入該狀態時,合作非常重要**。 生產者/消費者問題,其中讀取線程需要緩沖區處于“非空”狀態才能從緩沖區中讀取任何數據。 如果讀取線程發現緩沖區為空,則必須等待。 寫線程負責用數據填充緩沖區。 一旦寫入線程完成了更多寫入操作,讀取線程便可以進行更多讀取操作。 有時也稱為“**等待并通知**”或“**信號并繼續**”監視器,因為它保留了監視器的所有權,并在需要時繼續執行監視器區域(繼續)。 在稍后的某個時間,通知線程釋放監視器,并且等待線程恢復擁有該鎖。 **這種合作需要輸入集和等待集。** 下面給出的示意圖將幫助您理解這種合作。 ![java-monitor](https://img.kancloud.cn/e3/56/e356e7d2af43a03af0808d79a9df466e_501x306.png "java monitor") 上圖將監視器顯示為三個矩形。 在中心,一個大矩形包含一個線程,即顯示器的所有者。 在左側,一個小矩形包含條目集。 在右側,另一個小矩形包含等待集。 我希望以上討論將有助于您獲得更多見識。 免費免費問任何問題。 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看