2011-06-10 530 views
1

這可能是一個非常普遍的問題,但我仍然會拍攝,因爲我需要誠實的建議。我有一個非常簡單的庫,它主要是線程安全的,因爲大多數類都是不可變的。但是,我有2-3班不是,我不能修改它們。Java多線程和異步Http請求處理

該庫廣泛用於異步HTTP客戶端。它是這樣工作的。客戶端用觀察者實例化。觀察者處理所有完成,失敗或加載事件。觀察者也從這個其他庫調用必要的函數。

我正在使用異步HTTP客戶端,就像它運行在具有非阻塞io的單線程中。但是,在下面,客戶端使用線程池。

我的問題是:如果我使觀察者中的所有處理程序方法同步,是否可以解決所有其他線程安全問題?

例如,我們有以下設置。

Client -> calls methods from the 
    Observer 
     synchronized onLoaded -> calls thread unsafe code 
     synchronized onError -> calls thread unsafe code 
     synchronized onCompleted -> calls thread unsafe code 

如果這沒有意義,是否有可能以某種方式來執行主線程這些方法中的所有代碼,因此實現了非阻塞IO的設計我想跟進?

CLARIFICATIONS:我知道Async HTTP lib是基於線程和阻塞的,但其餘代碼不是......一切都基於事件。

回答

0

除了添加同步之外,請檢查這三(2)個方法是否不修改類字段。如果是的話,你可以使用ThreadLocal。

用法:uniqueNum是類字段,但它用ThreadLocal聲明。所以它是安全的。

import java.util.concurrent.atomic.AtomicInteger; 

public class UniqueThreadIdGenerator { 

    private static final AtomicInteger uniqueId = new AtomicInteger(0); 

    private static final ThreadLocal <Integer> uniqueNum = 
     new ThreadLocal <Integer>() { 
      @Override protected Integer initialValue() { 
       return uniqueId.getAndIncrement(); 
     } 
    }; 

    public static int getCurrentThreadId() { 
     return uniqueId.get(); 
    } 
} // UniqueThreadIdGenerator 
0

只要其他庫沒有/調用一個不安全的靜態方法,就應該使其線程安全。這僅適用於有多個Observers對象並且可以並行調用它們的情況。如果情況並非如此,那麼它應該沒問題。

+0

它對我有意義,但它在實踐中不起作用。我使用任何線程的唯一時間是作爲這個異步http客戶端的一部分,只是在觀察者上進行同步調用,它不會同步應用程序的其餘部分。 – Pass 2011-06-10 14:05:54