六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

編寫高效的線程安全類

[摘要]Java 編程語言為編寫多線程應(yīng)用程序提供強(qiáng)大的語言支持。但是,編寫有用的、沒有錯誤的多線程程序仍然比較困難。本文試圖概述幾種方法,程序員可用這幾種方法來創(chuàng)建高效的線程安全類。   并發(fā)性   只有當(dāng)要解決的問題需要一定程度的并發(fā)性時,程序員才會從多線程應(yīng)用程序中受益。例如,如果打印隊(duì)列應(yīng)用程序僅...
Java 編程語言為編寫多線程應(yīng)用程序提供強(qiáng)大的語言支持。但是,編寫有用的、沒有錯誤的多線程程序仍然比較困難。本文試圖概述幾種方法,程序員可用這幾種方法來創(chuàng)建高效的線程安全類。

  并發(fā)性

  只有當(dāng)要解決的問題需要一定程度的并發(fā)性時,程序員才會從多線程應(yīng)用程序中受益。例如,如果打印隊(duì)列應(yīng)用程序僅支持一臺打印機(jī)和一臺客戶機(jī),則不應(yīng)該將它編寫為多線程的。一般說來,包含并發(fā)性的編碼問題通常都包含一些可以并發(fā)執(zhí)行的操作,同時也包含一些不可并發(fā)執(zhí)行的操作。例如,為多個客戶機(jī)和一個打印機(jī)提供服務(wù)的打印隊(duì)列可以支持對打印的并發(fā)請求,但向打印機(jī)的輸出必須是串行形式的。多線程實(shí)現(xiàn)還可以改善交互式應(yīng)用程序的響應(yīng)時間。

  Synchronized 關(guān)鍵字

  雖然多線程應(yīng)用程序中的大多數(shù)操作都可以并行進(jìn)行,但也有某些操作(如更新全局標(biāo)志或處理共享文件)不能并行進(jìn)行。在這些情況下,必須獲得一個鎖來防止其他線程在執(zhí)行此操作的線程完成之前訪問同一個方法。在 Java 程序中,這個鎖是通過 synchronized 關(guān)鍵字提供的。清單 1 說明了它的用法。

  清單 1. 使用 synchronized 關(guān)鍵字來獲取鎖

  public class MaxScore {
   int max;
   public MaxScore() {
   max = 0;
   }

   public synchronized void currentScore(int s) {
   if(s> max) {
   max = s;
   }
   }

   public int max() {
   return max;
   }
  }

  這里,兩個線程不能同時調(diào)用 currentScore() 方法;當(dāng)一個線程工作時,另一個線程必須阻塞。但是,可以有任意數(shù)量的線程同時通過 max() 方法訪問最大值,因?yàn)?max() 不是同步方法,因此它與鎖定無關(guān)。

  試考慮在 MaxScore 類中添加另一個方法的影響,該方法的實(shí)現(xiàn)如清單 2 所示。

  清單 2. 添加另一個方法

  public synchronized void reset() {
   max = 0;
   }

  這個方法(當(dāng)被訪問時)不僅將阻塞 reset() 方法的其他調(diào)用,而且也將阻塞 MaxScore 類的同一個實(shí)例中的 currentScore() 方法,因?yàn)檫@兩個方法都訪問同一個鎖。如果兩個方法必須不彼此阻塞,則程序員必須在更低的級別使用同步。清單 3 是另一種情況,其中兩個同步的方法可能需要彼此獨(dú)立。

  清單 3. 兩個獨(dú)立的同步方法

  import java.util.*;

  public class Jury {
   Vector members;
   Vector alternates;

   public Jury() {
   members = new Vector(12, 1);
   alternates = new Vector(12, 1);
   }

   public synchronized void addMember(String name) {
   members.add(name);
   }

   public synchronized void addAlt(String name) {
   alternates.add(name);
   }

   public synchronized Vector all() {
   Vector retval = new Vector(members);
   retval.addAll(alternates);
   return retval;
   }
  }

  此處,兩個不同的線程可以將 members 和 alternates 添加到 Jury 對象中。請記住,synchronized 關(guān)鍵字既可用于方法,更一般地,也可用于任何代碼塊。清單 4 中的兩段代碼是等效的。

  清單 4. 等效的代碼

  synchronized void f() {
   void f() {
   // 執(zhí)行某些操作
   synchronized(this) {
   }
   // 執(zhí)行某些操作
   }
   }

  所以,為了確保 addMember() 和 addAlt() 方法不彼此阻塞,可按清單 5 所示重寫 Jury 類。

  清單 5. 重寫后的 Jury 類

  import java.util.*;

  public class Jury {
   Vector members;
   Vector alternates;

   public Jury() {
   members = new Vector(12, 1);
   alternates = new Vector(12, 1);
   }

   public void addMember(String name) {
   synchronized(members) {
   members.add(name);
   }
   }

   public void addAlt(String name) {
   synchronized(alternates) {
   alternates.add(name);
   }
   }

   public Vector all() {
   Vector retval;
   synchronized(members) {
   retval = new Vector(members);
   }

   synchronized(alternates) {
   retval.addAll(alternates);
   }

   return retval;
   }
  }

  請注意,我們還必須修改 all() 方法,因?yàn)閷?Jury 對象同步已沒有意義。在改寫后的版本中,addMember()、addAlt() 和 all() 方法只訪問與 members 和 alternates 對象相關(guān)的鎖,因此鎖定 Jury 對象毫無用處。另請注意,all() 方法本來可以寫為清單 6 所示的形式。

  清單 6. 將 members 和 alternates 用作同步的對象

  public Vector all() {
   synchronized(members) {
   synchronized(alternates) {
   Vector retval;
   retval = new Vector(members);
   retval.addAll(alternates);
   }
   }
   return retval;
   }

  但是,因?yàn)槲覀冊缭谛枰熬瞳@得 members 和 alternates 的鎖,所以這效率不高。清單 5 中的改寫形式是一個較好的示例,因?yàn)樗辉谧疃痰臅r間內(nèi)持有鎖,并且每次只獲得一個鎖。這樣就完全避免了當(dāng)以后增加代碼時可能產(chǎn)生的潛在死鎖問題。



主站蜘蛛池模板: 天天躁夜夜躁狠狠躁躁88 | 天天操夜夜添 | 亚洲免费大片 | 日本无人区码卡1 | 一级做a爰片性色毛片思念网 | 色天使色 | 爽爽影院在线18观看 | 在线免费观看亚洲视频 | 亚洲一区二区三区在线免费观看 | 色婷婷一区二区三区四区成人网 | 亚洲爱爱图片 | 日韩特黄特色大片免费视频 | 亚洲va欧美va国产综合下载 | 日韩一区二区精品久久高清 | 中文字幕女教师julia视频 | 欧美在线色视频 | 扬思敏版1996无减删版 | 亚洲成人高清在线 | 小说区图片区综合久久88 | 四虎影院久久 | 亚洲一区二区三区四区在线 | 欧美特黄三级在线观看 | 手机看免费毛片的网站 | 五月婷综合 | 午夜色a大片在线观看免费 午夜骚片 | 色网站免费看 | 色婷婷丁香六月 | 中文字幕第30页 | 日日噜噜夜夜躁躁狠狠 | 色噜噜亚洲男人的天堂 | 日韩黄色三级 | 日韩欧美在线综合 | 特级淫片欧美高清视频蜜桃 | 日本一区二区在线不卡 | 特黄毛片| 色综合合久久天天给综看 | 欧美亚洲国产一区二区 | 天堂资源在线www中文 | 亚洲一区 在线播放 | 日韩在线小视频 | 日韩无毛|