Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用闭包实现线程安全持久性_Java_Generics_Java 7 - Fatal编程技术网

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

Java 使用闭包实现线程安全持久性,java,generics,java-7,Java,Generics,Java 7,我有一个Java类负责与数据库的交互,还有几个对象,它们将同时访问数据库 因此,我必须确保在每个时间点,最多执行一个与数据库相关的操作 我打算在实现以下接口的类中实现这些操作: public interface IPersistenceAction<T> { T run(final IPersistenceState aPersistenceState); } 实现IPersistence接口的类应该 等待连接可用(即没有其他人使用它) 运行一组特定的数据库相关操作,并 返

我有一个Java类负责与数据库的交互,还有几个对象,它们将同时访问数据库

因此,我必须确保在每个时间点,最多执行一个与数据库相关的操作

我打算在实现以下接口的类中实现这些操作:

public interface IPersistenceAction<T> {
    T run(final IPersistenceState aPersistenceState);
}
实现
IPersistence
接口的类应该

  • 等待连接可用(即没有其他人使用它)
  • 运行一组特定的数据库相关操作,并
  • 返回操作的结果
  • 请注意,每个与数据库相关的操作都可能返回不同类型的结果,因此我们需要在
    IPersistenceAction

    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;
        }
        ...
    }
    
    公共类持久化实现IPersistence{
    私有IPersistenceState;//包含连接和语句
    private boolean busy=false;//指示当前是否有人使用该对象
    公共T运行操作(IPersistenceAction操作)
    {
    T returnValue=null;
    waitUntilIdle();
    已同步(此){
    忙=真;
    returnValue=action.run(状态);
    忙=假;
    notifyAll();
    }
    返回值;
    }
    ...
    }
    
    这违反了Java语法


    但是自从Java7以来,Java语言规范中就有闭包

    我是否可以使用它们来解决执行线程安全的数据库操作的任务,这些数据库操作具有不同的结果(不同的
    T
    s)


    如果是,您可以提供一个示例吗?

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

    public <T> T runAction(IPersistenceAction<T> action);
    
    公共运行操作(IPersistenceAction);
    

    将向编译器显示,T是一个类型参数,而不是类型本身。

    “自Java 7以来,Java语言规范中存在闭包”。链接这对我来说是全新的。我想你说的是Java8。这不是可以用一个操作队列和一个SingleThreadExecutor来解决的吗?以及未来的任务。
    公共运行操作(IPersistenceAction)应该有效吗?@Pyranja这似乎是答案。请照样提交,我会接受的。所以最后,这是一个泛型问题,不是持久性问题,也不是线程安全问题。。。你能编辑问题的标签吗?
    
    public <T> T runAction(IPersistenceAction<T> action);