我有一個負責與數據庫交互的Java類和幾個對象,它們將同時訪問它。使用閉包實現線程安全的持久性
因此,我必須確保在每個時間點,最多隻有一個與數據庫相關的操作正在執行。
我打算實現類的操作實現以下接口:
public interface IPersistenceAction<T> {
T run(final IPersistenceState aPersistenceState);
}
IPersistenceState
包含java.sql.Connection
和java.sql.Statement
引用:
public interface IPersistenceState {
void setStatement(final Statement aStatement);
Statement getStatement();
void setConnection(final Connection aConnection);
Connection getConnection();
}
實現IPersistence
接口應該
-
類
- 等到連接變爲可用(即,即沒有其他人使用它),
- 運行一組特定的數據庫相關操作並且
- 返回操作的結果。
注意,每個數據庫相關的操作可能會返回不同類型的結果,因此我們需要在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)?
如果是,你能提供一個例子嗎?
「自Java 7以來,Java語言規範中存在關閉」。鏈接?這對我來說是全新的。我想你是在談論Java 8. –
這是不是可以通過一個操作隊列和一個SingleThreadExecutor來解決?以及FutureTasks。 – Kayaman
'公衆 T runAction(IPersistenceAction 行動);'應該工作? –
Pyranja