同步方法與同步代碼塊的區別


同步方法與同步代碼塊的區別

                                        </div>

                                        <div class="blog-single-desc">
                                            <p style="text-indent: 2em;"><br></p><p style="text-indent: 2em;">在面試中,我們經常遇到的一個問題是,<code class="cCode">同步方法</code>與<code class="cCode">同步代碼塊</code>的區別。或者另一種提問方式,在實際開發中,是使用同步代碼塊好,還是使用同步方法好。<br></p><p style="text-indent: 2em;">這個考驗的是實際上是讀者對java同步和鎖的理解深刻程度。</p><p style="text-indent: 2em;">結論是很明顯的,同步代碼塊比同步方法好。原因如下:</p><p style="text-indent: 2em;"><strong>1、我們只需要對<code class="cCode">臨界區</code>的代碼進行同步</strong></p><p style="text-indent: 2em;">因為多線程只會對臨界區的代碼訪問順序敏感,因此在執行同步操作的時候,如果使用的是同步方法,那么整個方法中的所有內容都會被當做一個原子操作。而事實上在大多數情況下,我們可能只是方法中某一段內容需要同步,同步代碼塊可以幫助我們只在必要的地方進行同步。</p><p style="text-indent: 2em;">當然,如果方法中的所有內容的確都是要當做一個原子操作進行,那么此時同步代碼塊和同步方法其實效果是一樣的。</p><p style="text-indent: 2em;"><strong>2、在同步代碼塊中,我們可以自由的選擇鎖</strong></p><p style="text-indent: 2em;">在同步代碼塊中,我們可以自由的選擇任何一個java對象實例作為同步過程中要使用到的鎖。但是對於實例同步方法而言,這個鎖是不能選擇的,就是這個對象實例。對於靜態同步方法而言,這個鎖就是類的class對象實例。</p><p style="text-indent: 2em;">不能自由的選擇鎖,就會產生一個很大的問題。例如我們類中定了兩個不同的實例同步方法,這兩個方法在業務上並沒有太多關聯。當某個線程在調用其中一個同步實例方法的時候,其他的線程就無法繼續調用另外的一個實例同步方法。這是因為,鎖只有一個,就是這個類實例對象。必須要等到一個實例同步方法執行完成,把鎖釋放了之后,其他的線程得到鎖,才能執行另外一個同步方法。</p><p style="text-indent: 2em;">因為兩個實例同步方法的確沒有什么關聯,所以我們是希望兩個同步方法被同時調用的,只要每個方法中的內容可以原子方式執行即可。但是因為我們使用的是同步方法,而鎖只有一個(對象實例),因此沒有關聯的兩個需要同步執行的方法互相產生了影響。</p><p style="text-indent: 2em;">如果我們使用的是同步代碼塊,那么我們就可以自由的選擇做,我們可以定義兩個任意對象的實例作為鎖,然后在不同的方法內部使用同步代碼塊,並且各自使用其中一個鎖,這樣就可以避免多個同步實例方法彼此之間的項目影響。 &nbsp;</p><p style="text-indent: 2em;"><br></p>
                                        </div>

原文地址:http://www.tianshouzhi.com/api/tutorials/mutithread/284


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM