青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數(shù)據(jù)加載中……

編寫高效的java線程安全類

2000 4 01

在語言級支持鎖定對象和線程間發(fā)信使編寫線程安全類變得簡單。本文使用簡單的編程示例來說明開發(fā)高效的線程安全類是多么有效而直觀。

Java 編程語言為編寫多線程應(yīng)用程序提供強(qiáng)大的語言支持。但是,編寫有用的、沒有錯(cuò)誤的多線程程序仍然比較困難。本文試圖概述幾種方法,程序員可用這幾種方法來創(chuàng)建高效的線程安全類。

并發(fā)性

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

 

 

Synchronized 關(guān)鍵字

雖然多線程應(yīng)用程序中的大多數(shù)操作都可以并行進(jìn)行,但也有某些操作(如更新全局標(biāo)志或處理共享文件)不能并行進(jìn)行。在這些情況下,必須獲得一個(gè)鎖來防止其他線程在執(zhí)行此操作的線程完成之前訪問同一個(gè)方法。在 Java 程序中,這個(gè)鎖是通過 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;
    }
}

 

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

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


清單 2. 添加另一個(gè)方法

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

 

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


清單 3. 兩個(gè)獨(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;
    }
}

 

此處,兩個(gè)不同的線程可以將 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)閷?span lang="EN-US"> 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 中的改寫形式是一個(gè)較好的示例,因?yàn)樗辉谧疃痰臅r(shí)間內(nèi)持有鎖,并且每次只獲得一個(gè)鎖。這樣就完全避免了當(dāng)以后增加代碼時(shí)可能產(chǎn)生的潛在死鎖問題。

 

 

同步方法的分解

正如在前面看到的那樣,同步方法獲取對象的一個(gè)鎖。如果該方法由不同的線程頻繁調(diào)用,則此方法將成為瓶頸,因?yàn)樗鼤?huì)對并行性造成限制,從而會(huì)對效率造成限制。這樣,作為一個(gè)一般的原則,應(yīng)該盡可能地少用同步方法。盡管有這個(gè)原則,但有時(shí)一個(gè)方法可能需要完成需要鎖定一個(gè)對象幾項(xiàng)任務(wù),同時(shí)還要完成相當(dāng)耗時(shí)的其他任務(wù)。在這些情況下,可使用一個(gè)動(dòng)態(tài)的鎖定-釋放-鎖定-釋放方法。例如,清單 7 和清單 8 顯示了可按這種方式變換的代碼。


清單 7. 最初的低效率代碼

public synchonized void doWork() {
         unsafe1();
    write_file();
    unsafe2();
}




清單 8. 重寫后效率較高的代碼

public void doWork() {
    synchonized(this) {
                 unsafe1();
    }
    write_file();
    synchonized(this) {
        unsafe2();
    }
}

 

清單 7 和清單 8 假定第一個(gè)和第三個(gè)方法需要對象被鎖定,而更耗時(shí)的 write_file() 方法不需要對象被鎖定。如您所見,重寫此方法以后,對此對象的鎖在第一個(gè)方法完成以后被釋放,然后在第三個(gè)方法需要時(shí)重新獲得。這樣,當(dāng) write_file() 方法執(zhí)行時(shí),等待此對象的鎖的任何其他方法仍然可以運(yùn)行。將同步方法分解為這種混合代碼可以明顯改善性能。但是,您需要注意不要在這種代碼中引入邏輯錯(cuò)誤。

 

 

嵌套類

內(nèi)部類在 Java 程序中實(shí)現(xiàn)了一個(gè)令人關(guān)注的概念,它允許將整個(gè)類嵌套在另一個(gè)類中。嵌套類作為包含它的類的一個(gè)成員變量。如果定期被調(diào)用的的一個(gè)特定方法需要一個(gè)類,就可以構(gòu)造一個(gè)嵌套類,此嵌套類的唯一任務(wù)就是定期調(diào)用所需的方法。這消除了對程序的其他部分的相依性,并使代碼進(jìn)一步模塊化。清單 9,一個(gè)圖形時(shí)鐘的基礎(chǔ),使用了內(nèi)部類。


清單 9. 圖形時(shí)鐘示例

public class Clock {
    protected class Refresher extends Thread {
        int refreshTime;
        public Refresher(int x) {
            super("Refresher");
            refreshTime = x;
        }
        public void run() {
            while(true) {
                try {
                    sleep(refreshTime);
                }
                catch(Exception e) {}
                repaint();
            }
        }
    }
    public Clock() {
        Refresher r = new Refresher(1000);
        r.start();
    }
    private void repaint() {
        // 獲取時(shí)間的系統(tǒng)調(diào)用
        // 重繪時(shí)鐘指針
    }
}

 

清單 9 中的代碼示例不靠任何其他代碼來調(diào)用 repaint() 方法。這樣,將一個(gè)時(shí)鐘并入一個(gè)較大的用戶界面就相當(dāng)簡單。

 

 

事件驅(qū)動(dòng)處理

當(dāng)應(yīng)用程序需要對事件或條件(內(nèi)部的和外部的)作出反映時(shí),有兩種方法或用來設(shè)計(jì)系統(tǒng)。在第一種方法(稱為輪詢)中,系統(tǒng)定期確定這一狀態(tài)并據(jù)此作出反映。這種方法(雖然簡單)也效率不高,因?yàn)槟冀K無法預(yù)知何時(shí)需要調(diào)用它。

第二種方法(稱為事件驅(qū)動(dòng)處理)效率較高,但實(shí)現(xiàn)起來也較為復(fù)雜。在事件驅(qū)動(dòng)處理的情況下,需要一種發(fā)信機(jī)制來控制某一特定線程何時(shí)應(yīng)該運(yùn)行。在 Java 程序中,您可以使用 wait()notify() notifyAll() 方法向線程發(fā)送信號。這些方法允許線程在一個(gè)對象上阻塞,直到所需的條件得到滿足為止,然后再次開始運(yùn)行。這種設(shè)計(jì)減少了 CPU 占用,因?yàn)榫€程在阻塞時(shí)不消耗執(zhí)行時(shí)間,并且可在 notify() 方法被調(diào)用時(shí)立即喚醒。與輪詢相比,事件驅(qū)動(dòng)方法可以提供更短的響應(yīng)時(shí)間。

 

 

創(chuàng)建高效的線程安全類的步驟

編寫線程安全類的最簡單的方法是用 synchronized 聲明每個(gè)方法。雖然這種方案可以消除數(shù)據(jù)損壞,但它同時(shí)也會(huì)消除您預(yù)期從多線程獲得的任何收益。這樣,您就需要分析并確保在 synchronized 塊內(nèi)部僅占用最少的執(zhí)行時(shí)間。您必須格外關(guān)注訪問緩慢資源文件、目錄、網(wǎng)絡(luò)套接字和數(shù)據(jù)庫的方法,這些方法可能降低您的程序的效率。盡量將對這類資源的訪問放在一個(gè)單獨(dú)的線程中,最好在任何 synchronized 代碼之外。

一個(gè)線程安全類的示例 被設(shè)計(jì)為要處理的文件的中心儲(chǔ)存庫。它與使用 getWork() finishWork() WorkTable 類對接的一組線程一起工作。本例旨在讓您體驗(yàn)一下全功能的線程安全類,該類使用了 helper 線程和混合同步。請注意繼續(xù)添加要處理的新文件的Refresher helper 線程的用法。本例沒有調(diào)整到最佳性能,很明顯有許多地方可以改寫以改善性能,比如將 Refresher 線程改為使用 wait()/notify() 方法事件驅(qū)動(dòng)的,改寫 populateTable() 方法以減少列出磁盤上的文件(這是高成本的操作)所產(chǎn)生的影響。

 

 

小結(jié)

通過使用可用的全部語言支持,Java 程序中的多線程編程相當(dāng)簡單。但是,使線程安全類具有較高的效率仍然比較困難。為了改善性能,您必須事先考慮并謹(jǐn)慎使用鎖定功能。

 

參考資料

 

關(guān)于作者

clip_image002

 

clip_image003

Neel V. Kumar 是一位具有八年面向?qū)ο缶幊探?jīng)驗(yàn)的軟件工程師,所用的語言為 C++ Java 編程語言。他出生在愛荷華州,目前住在加利福尼亞的 Menlo Park,剛剛涉足電信領(lǐng)域。他曾經(jīng)為許多項(xiàng)目提供過咨詢服務(wù),并樂意與別人分享他的知識(shí)。可以通過 neelvk@terway.com 與他聯(lián)系。

 

posted on 2009-08-25 22:38 肥仔 閱讀(711) 評論(0)  編輯 收藏 引用 所屬分類: Web-后臺(tái)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            另类激情亚洲| 久久婷婷蜜乳一本欲蜜臀| 欧美手机在线视频| 欧美激情亚洲国产| 欧美日韩福利在线观看| 欧美小视频在线| 国产精品久久久久久久app| 国产精品日韩一区二区| 国产日韩欧美一区在线 | 欧美在线亚洲| 亚洲欧美另类综合偷拍| 欧美一区二区三区在线免费观看| 久久精品人人做人人爽电影蜜月| 噜噜噜91成人网| 亚洲乱码国产乱码精品精天堂| 夜夜嗨av一区二区三区四季av| 中日韩美女免费视频网址在线观看 | 欧美色视频日本高清在线观看| 国产精品一二三四| 狠狠色丁香婷婷综合| 亚洲九九九在线观看| 欧美一区二区日韩一区二区| 欧美电影在线播放| 亚洲在线免费视频| 免费永久网站黄欧美| 国产伦精品一区二区三区视频孕妇| 在线观看亚洲视频| 亚洲视频一区二区| 免费久久99精品国产| 99视频+国产日韩欧美| 久久亚洲二区| 国产欧美va欧美va香蕉在| 日韩一区二区久久| 久久婷婷久久| 午夜天堂精品久久久久 | 久久久999| 欧美午夜免费影院| 91久久综合| 久久亚洲欧美| 午夜精品久久久久久久99热浪潮| 欧美日韩黄色大片| 亚洲国产精品毛片| 久久久九九九九| 亚洲伊人一本大道中文字幕| 欧美日韩国产精品一区二区亚洲| 亚洲国产精品第一区二区三区| 久久国产精品久久w女人spa| 一本色道久久综合亚洲精品按摩| 欧美1区视频| 在线视频观看日韩| 久久先锋资源| 久久精品99久久香蕉国产色戒| 国产精品老牛| 亚洲视频1区| 亚洲精一区二区三区| 欧美77777| 亚洲乱码国产乱码精品精天堂| 欧美va亚洲va国产综合| 久久久久国产一区二区| 狠狠88综合久久久久综合网| 久久久91精品国产一区二区精品| 亚洲欧美在线播放| 欧美在线观看网站| 国产女主播在线一区二区| 午夜视频一区二区| 亚洲一区在线播放| 国产美女诱惑一区二区| 欧美在线91| 性欧美暴力猛交69hd| 国产亚洲欧美激情| 麻豆国产精品777777在线| 久久亚洲精品欧美| 最新中文字幕一区二区三区| 亚洲国产日韩美| 老牛国产精品一区的观看方式| 好吊成人免视频| 亚洲第一狼人社区| 欧美激情综合在线| 亚洲一区二区高清视频| 亚洲制服av| 激情文学一区| 亚洲破处大片| 国产麻豆视频精品| 欧美福利视频在线观看| 欧美日韩国产999| 久久福利视频导航| 免费欧美在线| 性色av一区二区三区| 久久亚洲国产精品一区二区 | 性做久久久久久免费观看欧美| 国外成人在线| 99国产精品久久| 合欧美一区二区三区| 亚洲免费av片| 狠狠色伊人亚洲综合网站色| 亚洲欧洲日本在线| 国产色爱av资源综合区| 亚洲国产视频a| 国产欧美日韩亚洲精品| 免费在线成人av| 国产精品久久久久久久浪潮网站| 狂野欧美激情性xxxx欧美| 欧美视频日韩视频| 欧美v日韩v国产v| 国产精品亚发布| 亚洲裸体俱乐部裸体舞表演av| 国产目拍亚洲精品99久久精品| 亚洲国产黄色| 狠狠干综合网| 亚洲欧美成人一区二区在线电影| 亚洲精品一级| 久久免费午夜影院| 欧美一区二区三区精品电影| 欧美阿v一级看视频| 久久国产主播精品| 欧美三级午夜理伦三级中文幕| 欧美成人午夜激情| 激情久久五月| 先锋影音久久| 午夜精品久久久久久久99水蜜桃 | 欧美日韩一区二区在线视频| 欧美aa国产视频| 国产亚洲精品久久久| 99re热这里只有精品视频| 久久久999国产| 久久精品国产77777蜜臀| 欧美日韩在线另类| 欧美国产欧美亚洲国产日韩mv天天看完整 | 免费成年人欧美视频| 国产情侣一区| 亚洲男女自偷自拍| 亚洲综合不卡| 国产精品户外野外| 一区二区三区成人| 亚洲午夜在线视频| 欧美性猛交99久久久久99按摩| 日韩一区二区精品视频| 亚洲特级片在线| 欧美视频一区二区在线观看 | 亚洲第一区在线| 久久精品一区二区三区不卡牛牛 | 国产精品99久久久久久久女警| 中文欧美日韩| 国产精品久久午夜| 亚洲一区免费网站| 欧美专区在线播放| 国产一区二区三区黄视频| 久久激情综合网| 欧美国产第二页| 99精品久久免费看蜜臀剧情介绍| 欧美精品v国产精品v日韩精品| 99国内精品久久| 销魂美女一区二区三区视频在线| 国产区欧美区日韩区| 久久九九免费| 亚洲精品1区| 性久久久久久久久久久久| 国产亚洲在线观看| 久热精品在线视频| 亚洲美女黄色片| 欧美亚洲免费在线| 在线观看日韩专区| 欧美日韩精品一区二区| 亚洲一区二区免费在线| 狂野欧美一区| 亚洲性图久久| 激情伊人五月天久久综合| 欧美成人精品三级在线观看| 一区二区久久久久| 久久综合久久综合久久| 日韩一级大片在线| 国产一区清纯| 欧美日韩www| 久久精品视频一| 艳女tv在线观看国产一区| 黄色精品网站| 欧美激情精品久久久六区热门 | 欧美超级免费视 在线| 亚洲午夜视频| 亚洲高清不卡| 久久精品人人做人人爽| 一区二区三区国产| 一区在线免费| 国产裸体写真av一区二区| 欧美精品1区2区| 久久婷婷麻豆| 欧美一级欧美一级在线播放| 亚洲精品中文字幕在线观看| 久久综合伊人77777| 亚洲欧美激情视频在线观看一区二区三区| 一区在线免费| 国产亚洲aⅴaaaaaa毛片| 欧美日韩亚洲一区二区三区在线 | 欧美成人日本| 久久精品国产在热久久| 国产精品99久久久久久久vr| 亚洲免费观看在线视频| 亚洲第一综合天堂另类专| 另类亚洲自拍| 久久久久九九九|