Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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_Vector_Synchronized - Fatal编程技术网

Java 将多个向量同步在一起

Java 将多个向量同步在一起,java,vector,synchronized,Java,Vector,Synchronized,我有一个静态向量用户,每个用户都有一个或多个帐户,所以每个用户都有一个向量帐户。用户和帐户具有唯一的id。 添加一个新用户很简单:我得到了一个静态向量,我可以很容易地检查最后一个用户的id,并且我可以为执行User.getId()+1的新用户获得新id 添加新用户后,添加新帐户会出现问题。帐户id必须是唯一的,因此我必须检查每个用户帐户向量中包含的最大id。假设许多进程可以添加/删除用户和帐户,那么同步所有帐户向量并安全添加/删除帐户的最佳方法是什么 实际上,用户添加如下 public bool

我有一个静态向量用户,每个用户都有一个或多个帐户,所以每个用户都有一个向量帐户。用户和帐户具有唯一的id。 添加一个新用户很简单:我得到了一个静态向量,我可以很容易地检查最后一个用户的id,并且我可以为执行User.getId()+1的新用户获得新id

添加新用户后,添加新帐户会出现问题。帐户id必须是唯一的,因此我必须检查每个用户帐户向量中包含的最大id。假设许多进程可以添加/删除用户和帐户,那么同步所有帐户向量并安全添加/删除帐户的最佳方法是什么

实际上,用户添加如下

public boolean addNewUser(User user)
{
    if(user!=null)
    {
        int id=getNewUserId();
        if(id!=-1)
        {
            user.setId(id);
            utenti.add(user);
            return false;
        }
        else
            return false;
    }
    else
        return false;
}

private int getNewUserId()
{
    User user=utenti.lastElement();
    if(user!=null)
        return user.getId()+1;
    else
        return -1;
}

关于id,我建议使用一个长值,该值可以一直递增(不考虑删除的帐户)

同步将更加困难,这取决于您想做什么。 一个简单的规则是,如果您有一个列表对象,则无论何时访问它(读或写),都要使用同步块:


根据您的具体使用情况,可能会有更好的方法,但这应该是可行的。

可能不是最有效的方法,但您可以先输入一个int,然后检查每个用户的每个帐户列表的大小

int id = 0;
for (User user : AllUsers) {
    id += user.listOfAccounts.size();
}
现在您的id将是最后一个id。创建新帐户时只需添加1即可


请注意,如果可以删除帐户,则会出现问题。

这是您正在处理的旧代码吗?如果没有,那么首先请避免使用
Vector
。请向我们展示一些代码片段,说明您当前如何添加用户和帐户。我应该在Vector上使用什么?为什么?不幸的是,我还没有生成任何函数,我将在有解决方案时对其进行编码;)所有这些都存储在内存中?您发布的代码中已经有了竞争条件。可能有两个用户使用相同的ID创建。您可能应该更清楚地描述如何添加帐户(或者如何添加帐户,可能再次使用“不安全”代码段)。也许你可以用它来生成ID,但到目前为止,这只是一个猜测。据我所知,只有原语可以被同步。这不对吗?请注意,每个users.elementAt(i)都有一个帐户向量。@mark只能同步对象。在任何给定的时间,某个对象只有一个同步块可以处于活动状态,这就是为什么在列表中使用它的原因。对象?你能提供一些关于它的官方文档吗?谢谢,这是一个很好的资源,可以解决我对同步的疑问。不幸的是,这里我应该同步一组vectors@mark没问题。您甚至可以创建一个空对象在其上进行同步。关键是这些代码不能同时执行,所以你是安全的。您只需要一个指示符变量,如isEditingTheList,就可以对其进行同步。
int id = 0;
for (User user : AllUsers) {
    id += user.listOfAccounts.size();
}