亚洲欧洲国产欧美一区精品,激情五月亚洲色五月,最新精品国偷自产在线婷婷,欧美婷婷丁香五月天社区

      考試首頁 | 考試用書 | 培訓(xùn)課程 | 模擬考場 | 考試論壇  
      全國  |             |          |          |          |          |         
        當(dāng)前位置:計算機(jī)等級 > 二級考試 > Java語言程序設(shè)計 > 考試輔導(dǎo) > 文章內(nèi)容
        

      全國計算機(jī)二級考試Java語言程序設(shè)計知識點(diǎn)(39)

      中華IT學(xué)院   【 】  [ 2016年5月10日 ]

        該模式是前面模式的擴(kuò)展;將某個值發(fā)布以在程序內(nèi)的其他地方使用,但是與一次性事件的發(fā)布不同,這是一系列獨(dú)立事件。這個模式要求被發(fā)布的值是有效不可變的 —— 即值的狀態(tài)在發(fā)布后不會更改。使用該值的代碼需要清楚該值可能隨時發(fā)生變化。

        模式 #4:“volatile bean” 模式

        volatile bean 模式適用于將 JavaBeans 作為“榮譽(yù)結(jié)構(gòu)”使用的框架。在 volatile bean 模式中,JavaBean 被用作一組具有 getter 和/或 setter 方法 的獨(dú)立屬性的容器。volatile bean 模式的基本原理是:很多框架為易變數(shù)據(jù)的持有者(例如 HttpSession)提供了容器,但是放入這些容器中的對象必須是線程安全的。

        在 volatile bean 模式中,JavaBean 的所有數(shù)據(jù)成員都是 volatile 類型的,并且 getter 和 setter 方法必須非常普通 —— 除了獲取或設(shè)置相應(yīng)的屬性外,不能包含任何邏輯。此外,對于對象引用的數(shù)據(jù)成員,引用的對象必須是有效不可變的。(這將禁止具有數(shù)組值的屬性,因?yàn)楫?dāng)數(shù)組引用被聲明為 volatile 時,只有引用而不是數(shù)組本身具有 volatile 語義)。對于任何 volatile 變量,不變式或約束都不能包含 JavaBean 屬性。清單 5 中的示例展示了遵守 volatile bean 模式的 JavaBean:

        清單 5. 遵守 volatile bean 模式的 Person 對象

      @ThreadSafe

      public class Person {

      private volatile String firstName;

      private volatile String lastName;

      private volatile int age;

      public String getFirstName() { return firstName; }

      public String getLastName() { return lastName; }

      public int getAge() { return age; }

      public void setFirstName(String firstName) {

      this.firstName = firstName;

      }

      public void setLastName(String lastName) {

      this.lastName = lastName;

      }

      public void setAge(int age) {

      this.age = age;

      }

      }

        volatile 的高級模式

        前面幾節(jié)介紹的模式涵蓋了大部分的基本用例,在這些模式中使用 volatile 非常有用并且簡單。這一節(jié)將介紹一種更加高級的模式,在該模式中,volatile 將提供性能或可伸縮性優(yōu)勢。

        volatile 應(yīng)用的的高級模式非常脆弱。因此,必須對假設(shè)的條件仔細(xì)證明,并且這些模式被嚴(yán)格地封裝了起來,因?yàn)榧词狗浅P〉母囊矔䲟p壞您的代碼!同樣,使用更高級的 volatile 用例的原因是它能夠提升性能,確保在開始應(yīng)用高級模式之前,真正確定需要實(shí)現(xiàn)這種性能獲益。需要對這些模式進(jìn)行權(quán)衡,放棄可讀性或可維護(hù)性來換取可能的性能收益 —— 如果您不需要提升性能(或者不能夠通過一個嚴(yán)格的測試程序證明您需要它),那么這很可能是一次糟糕的交易,因?yàn)槟芸赡軙貌粌斒,換來的東西要比放棄的東西價值更低。

        模式 #5:開銷較低的讀-寫鎖策略

        目前為止,您應(yīng)該了解了 volatile 的功能還不足以實(shí)現(xiàn)計數(shù)器。因?yàn)?++x 實(shí)際上是三種操作(讀、添加、存儲)的簡單組合,如果多個線程湊巧試圖同時對 volatile 計數(shù)器執(zhí)行增量操作,那么它的更新值有可能會丟失。

        然而,如果讀操作遠(yuǎn)遠(yuǎn)超過寫操作,您可以結(jié)合使用內(nèi)部鎖和 volatile 變量來減少公共代碼路徑的開銷。清單 6 中顯示的線程安全的計數(shù)器使用synchronized 確保增量操作是原子的,并使用 volatile 保證當(dāng)前結(jié)果的可見性。如果更新不頻繁的話,該方法可實(shí)現(xiàn)更好的性能,因?yàn)樽x路徑的開銷僅僅涉及 volatile 讀操作,這通常要優(yōu)于一個無競爭的鎖獲取的開銷。

        清單 6. 結(jié)合使用 volatile 和 synchronized 實(shí)現(xiàn) “開銷較低的讀-寫鎖”

      @ThreadSafe

      public class CheesyCounter {

      // Employs the cheap read-write lock trick

      // All mutative operations MUST be done with the 'this' lock held

      @GuardedBy("this"private volatile int value;

      public int getValue() { return value; }

      public synchronized int increment() {

      return value++;

      }

      }

        之所以將這種技術(shù)稱之為 “開銷較低的讀-寫鎖” 是因?yàn)槟褂昧瞬煌耐綑C(jī)制進(jìn)行讀寫操作。因?yàn)楸纠械膶懖僮鬟`反了使用 volatile 的第一個條件,因此不能使用 volatile 安全地實(shí)現(xiàn)計數(shù)器 —— 您必須使用鎖。然而,您可以在讀操作中使用 volatile 確保當(dāng)前值的可見性,因此可以使用鎖進(jìn)行所有變化的操作,使用 volatile 進(jìn)行只讀操作。其中,鎖一次只允許一個線程訪問值,volatile 允許多個線程執(zhí)行讀操作,因此當(dāng)使用 volatile 保證讀代碼路徑時,要比使用鎖執(zhí)行全部代碼路徑獲得更高的共享度 —— 就像讀-寫操作一樣。然而,要隨時牢記這種模式的弱點(diǎn):如果超越了該模式的最基本應(yīng)用,結(jié)合這兩個競爭的同步機(jī)制將變得非常困難。

      分享到:
      本文糾錯】【告訴好友】【打印此文】【返回頂部
      將考試網(wǎng)添加到收藏夾 | 每次上網(wǎng)自動訪問考試網(wǎng) | 復(fù)制本頁地址,傳給QQ/MSN上的好友 | 申請鏈接 | 意見留言 TOP
      關(guān)于本站  網(wǎng)站聲明  廣告服務(wù)  聯(lián)系方式  站內(nèi)導(dǎo)航  考試論壇
      Copyright © 2007-2013 中華考試網(wǎng)(Examw.com) All Rights Reserved