<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    細心!用心!耐心!

    吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學(xué)業(yè),五六點粗墨,七八筆買賣,九十道人情。

    BlogJava 聯(lián)系 聚合 管理
      1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
    無論如何,要編寫一個多執(zhí)行緒安全(thread-safe)的程式總是困難的,為了使用的共用資源,您必須小心的對共用資源進行同步,同步帶來一定的效能延遲,而另一方面,在處理同步的時候,又要注意物件的鎖定與釋放,避免產(chǎn)生死結(jié),種種因素都使得編寫多執(zhí)行緒程式變得困難。

    Thread-Specific Storage模式嘗試從另一個角度來解釋多執(zhí)行緒共用資源的問題,其思考點很簡單,即然共用資源這麼困難,那麼就乾脆不要共用,何不為每個執(zhí)行緒創(chuàng)造一個資源的複本,將每一個執(zhí)行緒存取資料的行為加以隔離,其實現(xiàn)的方法,就是給予每一個執(zhí)行緒一個特定空間來保管該執(zhí)行緒所獨享的資源,也因此而稱之為 Thread- Specific Storage模式。

    在Java中可以使用java.lang.ThreadLocal來實現(xiàn)這個模式,這個類別是從1.2之後開始提供,不過先來看看,如何自行實現(xiàn)一個簡單的ThreadLocal類別:
    • ThreadLocal.java
    import java.util.*;

    public class ThreadLocal {
    private Map storage =
    Collections.synchronizedMap(new HashMap());

    public Object get() {
    Thread current = Thread.currentThread();
    Object o = storage.get(current);

    if(o == null && !storage.containsKey(current)) {
    o = initialValue();
    storage.put(current, o);
    }

    return o;
    }

    public void set(Object o) {
    storage.put(Thread.currentThread(), o);
    }

    public Object initialValue() {
    return null;
    }
    }

    可以看到程式中使用執(zhí)行緒本身作為key值,並將所獲得的資源放在Map物件中,如果第一次使用get(),也配置一個空間給執(zhí)行緒,而 initialValue()可以用來設(shè)定什麼樣的初值要先儲存在這個空間中,在這邊先簡單的設(shè)定為null。

    現(xiàn)在假設(shè)有一個原先在單執(zhí)行緒環(huán)境下的資源SomeResource,現(xiàn)在考慮要該其在多執(zhí)行緒環(huán)境下使用,若不想考慮複雜的執(zhí)行緒共用互斥問題,此時可以使用ThreadLocal類別來使用SomeResource,例如:
    • Resource.java
    public class Resource {
    private static final ThreadLocal threadLocal =
    new ThreadLocal();

    public static SomeResource getResource() {
    SomeResource resource =
    (SomeResource) threadLocal.get();

    if(resource == null) {
    resource = new SomeResource();
    threadLocal.set(resource);
    }

    return resource;
    }
    }

    上面所實作的ThreadLocal類別只是一個簡單的示範(fàn),您可以使用java.lang.ThreadLocal來實現(xiàn)Thread- Specific Storage模式,以獲得更好的效能,在這邊簡單的示範(fàn)一個Log程式,它可以記錄每個執(zhí)行緒的活動,所使用的是 java.util.logging中的類別:
    • SimpleThreadLogger.java
    import java.io.*;
    import java.util.logging.*;

    public class SimpleThreadLogger {
    private static final ThreadLocal threadLocal =
    new ThreadLocal();

    public static void log(String msg) {
    getThreadLogger().log(Level.INFO, msg);
    }

    private static Logger getThreadLogger() {
    Logger logger = (Logger) threadLocal.get();

    if(logger == null) {
    try {
    logger = Logger.getLogger(
    Thread.currentThread().getName());
    // Logger 預(yù)設(shè)是在主控臺輸出
    // 我們加入一個檔案輸出的Handler
    // 它會輸出XML的記錄文件
    logger.addHandler(
    new FileHandler(
    Thread.currentThread().getName()
    + ".log"));
    }
    catch(IOException e) {}

    threadLocal.set(logger);
    }

    return logger;
    }
    }

    可以使用下面這個程式來測試:
    • LoggerTest.java
    public class LoggerTest {
    public static void main(String[] args) {
    new TestThread("thread1").start();
    new TestThread("thread2").start();
    new TestThread("thread3").start();
    }
    }

    class TestThread extends Thread {
    public TestThread(String name) {
    super(name);
    }

    public void run() {
    for(int i = 0; i < 10; i++) {
    SimpleThreadLogger.log(getName() +
    ": message " + i);
    try {
    Thread.sleep(1000);
    }
    catch(Exception e) {
    SimpleThreadLogger.log(e.toString());
    }
    }
    }
    }

    執(zhí)行LoggerTest可以在主控臺上看到輸出,並可以在同一目錄下找到三個log檔,分別記錄了三個執(zhí)行緒的活動,透過 ThreadLocal,不用撰寫複雜的執(zhí)行緒共用互斥邏輯。

    Thread-Specific Storage模式的意義之一,就是「有時不共用是好的」,如果共用會產(chǎn)生危險,那就不要共用,當(dāng)然,這種方式所犧牲掉的就是空間,您必須為每一個執(zhí)行緒保留它們獨立的空間,這是一種以空間換取時間與安全性的方法。
    posted on 2007-04-17 10:59 張金鵬 閱讀(680) 評論(0)  編輯  收藏 所屬分類: 多執(zhí)行緒模式
    主站蜘蛛池模板: 一道本不卡免费视频| 亚洲成在人线aⅴ免费毛片| 大学生美女毛片免费视频| 亚洲成无码人在线观看| 亚洲日本天堂在线| 三年片在线观看免费大全| 亚洲精品国产日韩无码AV永久免费网| 亚洲天然素人无码专区| 99久久精品日本一区二区免费| 久久久久久99av无码免费网站| 成年女人永久免费观看片| 亚洲欧洲专线一区| 性盈盈影院免费视频观看在线一区| 亚洲国产精品成人| 亚洲情A成黄在线观看动漫软件| 久久水蜜桃亚洲av无码精品麻豆| 亚洲中文字幕无码一去台湾 | 亚洲人6666成人观看| 曰韩无码AV片免费播放不卡 | 在线观看免费人成视频色| 国产.亚洲.欧洲在线| 四虎影在线永久免费观看| 日韩精品无码免费视频| 亚洲精品国产字幕久久不卡 | 久久久久亚洲精品无码系列| 成在线人视频免费视频| 亚洲黄色三级视频| 最近国语视频在线观看免费播放| 成人毛片免费在线观看| 日韩亚洲一区二区三区| 性色午夜视频免费男人的天堂| 91九色精品国产免费| 亚洲欧美国产精品专区久久| 亚洲综合激情另类专区| 精品亚洲福利一区二区| 天天操夜夜操免费视频| xxxxx做受大片在线观看免费| 无码国产精品一区二区免费I6| 亚洲AV永久精品爱情岛论坛| 日韩精品成人无码专区免费| 一级做a爰片久久毛片免费看 |