2014-01-10 74 views
1

被保存歷史事件在我的應用程序,因爲我需要提供一些代碼生成此代碼:製作類線程安全

public class LogDataBase { 
    public LogDataBase(Context context) { 
     try { 
      this.context = context; 
      String logPath = context.getFilesDir() + logStoragePath; 
      file = new File(logPath); 
      if (!file.exists()) { 
       file.createNewFile(); 
      } 
     } catch (Exception e) { 
     Errors += ("\n" + e.getMessage()); 
     } 
    } 
    public void addItem(String log) { 
     try { 
      dbWriter = new FileWriter(file, true); 
      //appand String log to file 
      .... 
    } 
    public ArrayList<String> getArrayList() { 
    //get all Logs as arraylist 
    } 
} 

的主要問題是如何開發的應用程序,是線程安全的?由於應用程序可能使用服務和多處理,多線程應確保代碼和類是安全的。

請提供這一重要議題一些綜合性的解釋(不只是說Synchronization , Lock,...
希望成爲別人的
在此先感謝有用。

+0

關於如何使線程保存沒有通用的答案。取決於你班上不能同時發生的事情。例如。在添加項目時,可能不應讀取/修改ArrayList。如果你返回一個引用你的內部列表,這意味着調用'getArrayList()'的客戶端需要參與同步 – zapl

+0

@zapl我同意你的觀點,沒有通用的答案,但可能存在通用的幫助指南 – FxRi4

+1

這就是這裏非常廣泛。你最好閱讀一本書,如[Java Concurrency in Practice](http://jcip.net/)或觀看一些視頻,如[this](http://www.youtube.com/watch?v=V2jFpFGAwcU) – zapl

回答

1

同步是保證部分代碼是線程安全的最簡單方法之一。但是由於它的阻塞,它會減慢你的應用程序。所以我建議的最好的方法是使用生產者消費者實現。因此,對於這些步驟是如下

  • 生產者
  • 添加信息記錄到一個隊列中的項目。添加到隊列應該同步
  • 然後通知該隊列上的所有線程塊。
  • 消費者
  • 單獨的線程在數據可用時使用隊列。讀隊列是唯一需要同步的東西。
  • 如果沒有項目在等待,直到有人通知

這樣可以最大限度地減少阻塞和保證線程安全的方式來處理一些任務隊列進行處理。

+0

其中一個最佳答案感謝 – FxRi4

+0

您可以使用[BlockingQueue](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html)處理阻止和同步最有效和最簡單的方法。 – aalku