亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        2013年計(jì)算機(jī)二級(jí)Java多線程入門(mén)技巧(10)

        字號(hào):

        使用Synchronized塊同步方法
            nchronized關(guān)鍵字有兩種用法。第一種就是在《使用Synchronized關(guān)鍵字同步類方法》一文中所介紹的直接用在方法的定義中。另外一種就是synchronized塊。我們不僅可以通過(guò)synchronized塊來(lái)同步一個(gè)對(duì)象變量。也可以使用synchronized塊來(lái)同步類中的靜態(tài)方法和非靜態(tài)方法。
            synchronized塊的語(yǔ)法如下public void method()
            2.{
            3. … …
            4. synchronized(表達(dá)式)
            5. {
            6. … …
            7. }
            8.}
            一、非靜態(tài)類方法的同步
            從《使用Synchronized關(guān)鍵字同步類方法》一文中我們知道使用synchronized關(guān)鍵字來(lái)定義方法就會(huì)鎖定類中所有使用synchronzied關(guān)鍵字定義的靜態(tài)方法或非靜態(tài)方法,但這并不好理解。而如果使用synchronized塊來(lái)達(dá)到同樣的效果,就不難理解為什么會(huì)產(chǎn)生這種效果了。如果想使用synchronized塊來(lái)鎖定類中所有的同步非靜態(tài)方法,需要使用this做為synchronized塊的參數(shù)傳入synchronized塊國(guó),代碼如下
            通過(guò)synchronized塊同步非靜態(tài)方法
            9.public class SyncBlock
            10. {
            11. public void method1()
            12. {
            13. synchronized(this) // 相當(dāng)于對(duì)method1方法使用synchronized關(guān)鍵字
            14. {
            15. … …
            16. }
            17. }
            18. public void method2()
            19. {
            20. synchronized(this) // 相當(dāng)于對(duì)method2方法使用synchronized關(guān)鍵字
            21. {
            22. … …
            23. }
            24. }
            25. public synchronized void method3()
            26. {
            27. … …
            28. }
            29. }
            在上面的代碼中的method1和method2方法中使用了synchronized塊。而第017行的method3方法仍然使用synchronized關(guān)鍵字來(lái)定義方法。在使用同一個(gè)SyncBlock類實(shí)例時(shí),這三個(gè)方法只要有一個(gè)正在執(zhí)行,其他兩個(gè)方法就會(huì)因未獲得同步鎖而被阻塞。在使用synchronized塊時(shí)要想達(dá)到和synchronized關(guān)鍵字同樣的效果,必須將所有的代碼都寫(xiě)在synchronized塊中,否則,將無(wú)法使當(dāng)前方法中的所有代碼和其他的方法同步。
            除了使用this做為synchronized塊的參數(shù)外,還可以使用SyncBlock.this作為synchronized塊的參數(shù)來(lái)達(dá)到同樣的效果。
            在內(nèi)類(InnerClass)的方法中使用synchronized塊來(lái)時(shí),this只表示內(nèi)類,和外類(OuterClass)沒(méi)有關(guān)系。但內(nèi)類的非靜態(tài)方法可以和外類的非靜態(tài)方法同步。如在內(nèi)類InnerClass中加一個(gè)method4方法,并使method4方法和SyncBlock的三個(gè)方法同步,代碼如下:
            使內(nèi)類的非靜態(tài)方法和外類的非靜態(tài)方法同步
            30.public class SyncBlock
            31.{
            32. … …
            33. class InnerClass
            34. {
            35. public void method4()
            36. {
            37. synchronized(SyncBlock.this)
            38. {
            39. … …
            40. }
            41. }
            42. }
            43. … …
            44.}
            在上面SyncBlock類的新版本中,InnerClass類的method4方法和SyncBlock類的其他三個(gè)方法同步,因此,method1、method2、method3和method4四個(gè)方法在同一時(shí)間只能有一個(gè)方法執(zhí)行。
            Synchronized塊不管是正常執(zhí)行完,還是因?yàn)槌绦虺鲥e(cuò)而異常退出synchronized塊,當(dāng)前的synchronized塊所持有的同步鎖都會(huì)自動(dòng)釋放。因此,在使用synchronized塊時(shí)不必?fù)?dān)心同步鎖的釋放問(wèn)題。