使用闭包实现线程安全持久性

时间:2013-07-11 07:21:07

标签: java generics java-7

我有一个负责与数据库交互的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. 返回操作结果。
  4. 请注意,每个与数据库相关的操作都可能返回不同类型的结果,因此我们需要在T

    中指定其类型IPersistenceAction<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)的数据库操作的任务?

    如果是,你能提供一个例子吗?

1 个答案:

答案 0 :(得分:1)

您可以向方法添加泛型类型参数:

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

<T>将显示编译器,T是类型参数而不是Type本身。