<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之旅 廣告
                # Java 并發性 – 線程安全性? > 原文: [https://howtodoinjava.com/java/multi-threading/what-is-thread-safety/](https://howtodoinjava.com/java/multi-threading/what-is-thread-safety/) 定義**線程安全性**非常棘手。 快速的 Google 搜索會發現許多類似的“定義”: 1. 線程安全代碼是即使許多線程同時執行也可以運行的代碼。 2. 如果一段代碼僅以保證多個線程同時安全執行的方式操作共享數據結構,則它是線程安全的。 并且還有更多類似的定義。 您難道不認為上述定義實際上并沒有傳達任何有意義的信息,甚至還會增加一些混亂。 盡管不能完全排除這些定義,因為它們沒有錯。 但是事實是**他們沒有提供任何實際的幫助或觀點**。 我們如何在線程安全類和不安全類之間區分?“**安全**”甚至意味著什么? ## 什么是線程安全的正確性? 線程安全性的任何合理定義的核心是正確性的概念。 因此,在了解線程安全性之前,我們應該首先了解“正確性”。 > 正確性是指一個類符合其規范。 您將同意,良好的類規范將在任何給定的時間獲取有關類狀態的所有信息,并且如果對類狀態進行了某些操作,則它是后置條件。 由于我們經常沒有為我們的類編寫足夠的規范,我們怎么可能知道它們是正確的? 我們不能,但是一旦我們說服自己“ *該代碼有效*”,這仍然不會阻止我們使用它們。 這個**“代碼置信度**”與我們許多人接近正確性的程度差不多。 將“正確性”樂觀地定義為可以識別的東西之后,我們現在可以以一種不太循環的方式定義線程安全性:**當從多個線程**中訪問時,如果類繼續正確運行,則該類是線程安全的。 > 如果一個類在從多個線程訪問時能正確運行,則無論該線程在運行時環境中對這些線程的執行進行調度或交織,并且在調用代碼部分沒有任何其他同步或其他協調的情況下,如果該類行為正確,則該線程是線程安全的。 如果此處對“正確性”的寬松使用使您感到困擾,則您可能更喜歡**認為線程安全類在并發環境中比在單線程環境**中不會被破壞。 線程安全類封裝了所有需要的同步,因此客戶端不需要提供自己的同步。 ## 示例:無狀態 Servlet 線程安全類的一個很好的例子是 java servlet,它沒有字段和引用,也沒有其他類的字段等。它們是**無狀態**。 ```java public class StatelessFactorizer implements Servlet { public void service(ServletRequest req, ServletResponse resp) { BigInteger i = extractFromRequest(req); BigInteger[] factors = factor(i); encodeIntoResponse(resp, factors); } } ``` 特定計算的暫態僅存在于局部變量中,這些局部變量存儲在線程的棧中,并且只有執行線程才能訪問。 一個線程訪問`StatelessFactorizer`不會影響另一線程訪問同一`StatelessFactorizer`的結果; 因為兩個線程不共享狀態,所以好像它們正在訪問不同的實例。 由于線程訪問無狀態對象的動作不會影響其他線程中操作的正確性,因此無狀態對象是線程安全的。 這就是圍繞“什么是線程安全?”這個小而重要的概念的全部內容。 **祝您學習愉快!**
                  <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>

                              哎呀哎呀视频在线观看