2013-07-11 79 views
0

我有一個負責與數據庫交互的Java類和幾個對象,它們將同時訪問它。使用閉包實現線程安全的持久性

因此,我必須確保在每個時間點,最多隻有一個與數據庫相關的操作正在執行。

我打算實現類的操作實現以下接口:

public interface IPersistenceAction<T> { 
    T run(final IPersistenceState aPersistenceState); 
} 

IPersistenceState包含java.sql.Connectionjava.sql.Statement引用:

public interface IPersistenceState { 

    void setStatement(final Statement aStatement); 

    Statement getStatement(); 

    void setConnection(final Connection aConnection); 

    Connection getConnection(); 

} 

實現IPersistence接口應該

  1. 等到連接變爲可用(即,即沒有其他人使用它),
  2. 運行一組特定的數據庫相關操作並且
  3. 返回操作的結果。

注意,每個數據庫相關的操作可能會返回不同類型的結果,因此我們需要在IPersistenceAction<T>

同樣的事情可以指定其類型T在Java中解釋說:

public class Persistence implements IPersistence { 
    private IPersistenceState state; // Contains connection and statement 
    private boolean busy = false; // Indicates whether someone uses the object at the moment 

    public T runAction(IPersistenceAction<T> action) 
    { 
     T returnValue = null; 

     waitUntilIdle(); 
     synchronized (this) { 
      busy = true; 

      returnValue = action.run(state); 

      busy = false; 

      notifyAll(); 
     } 

     return returnValue; 
    } 
    ... 
} 

這違反Java語法。

但是自Java 7以來,Java語言規範中就存在關閉。

我可以用它們來解決線程安全執行數據庫操作的任務與不同的結果(不同T S)?

如果是,你能提供一個例子嗎?

+2

「自Java 7以來,Java語言規範中存在關閉」。鏈接?這對我來說是全新的。我想你是在談論Java 8. –

+0

這是不是可以通過一個操作隊列和一個SingleThreadExecutor來解決?以及FutureTasks。 – Kayaman

+1

'公衆 T runAction(IPersistenceAction 行動);'應該工作? – Pyranja

回答

1

您可以將泛型類型參數添加到方法:

public <T> T runAction(IPersistenceAction<T> action); 

<T>將顯示編譯器,T是一個類型參數,而不是一個類型本身。

+0

所以最後,這是一個泛型問題,而不是一個持久性,或線程安全性......你能編輯問題的標籤嗎? – zEro