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