2014-08-28 2 views
2

저는 정적 벡터 사용자가 있습니다. 각 사용자는 하나 이상의 계정을 가지고 있으므로 모든 사용자에게 벡터 계정이 있습니다. 사용자 및 계정에는 고유 한 ID가 있습니다. 새 사용자를 추가하는 것은 간단합니다. 정적 벡터가있어서 마지막 사용자의 ID를 쉽게 확인할 수 있으며 user.getId() + 1을 (를) 수행하는 새 사용자의 새 ID를 얻을 수 있습니다.많은 벡터를 함께 동기화합니다.

새 사용자를 추가 한 후 새 계정을 추가하면 문제가 발생합니다. 계정 ID는 고유해야하므로 모든 사용자의 계정 벡터에 포함 된 가장 큰 ID를 확인해야합니다. 많은 프로세스가 사용자와 계정을 추가/제거 할 수 있다면 모든 계정 벡터를 동기화하고 계정을 안전하게 추가/제거하는 가장 좋은 방법은 무엇입니까? 나는 (삭제되는 계정의 regadless)는 당신이 모든 시간을 증가 값을 사용하는 것이 좋습니다 아이디에 관한

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; 
} 
+0

작업중인 기존 코드가 있습니까? 그렇지 않다면, 먼저'Vector'를 사용하지 마십시오. –

+0

현재 사용자와 계정을 어떻게 추가하고 있는지 보여주는 코드 스 니펫을 보여주십시오. –

+0

대신 Vector에 무엇을 사용해야합니까? 그리고 왜? 불행히도 나는 아직 어떤 기능도 만들지 못했고, 해결책이있을 때 코드화 할 것이다;) – mark

답변

1

을 다음과 같이

사실, 사용자가 추가됩니다.

동기화가 더 어렵고 원하는 작업에 따라 다릅니다. 쉬운 규칙은 목록 개체가 경우에 액세스 할 때마다, (읽기 또는 쓰기) 동기화 된 블록을 사용 될 것이다 : 더 나은 방법이있을 수 있습니다

synchronized(myList) { 
    //update the list, do whatever you like, there is no concurrent modification 
} 

를 정확한 사용에 따라, 그러나 이것은해야 작업.

+0

내가 아는 한, 프리미티브 만 동기화 할 수 있습니다. 틀렸어? 모든 users.elementAt (i)에는 계정 벡터가 있습니다. – mark

+2

@mark 개체 만 동기화 할 수 있습니다. 한 번에 특정 개체에 대해 하나의 동기화 된 블록 만 활성화 될 수 있으므로 목록에서 사용하는 것이 좋습니다. – J4v4

+0

개체? 그것에 대해 공식적인 문서를 제공해 주시겠습니까? – mark

1

아마 가장 효율적인 방법은 아니지만 int를 만들고 모든 사용자의 계정 목록 크기를 확인할 수 있습니다.

int id = 0; 
for (User user : AllUsers) { 
    id += user.listOfAccounts.size(); 
} 

이제 ID가 마지막 ID가됩니다. 새 계정을 만들 때 1을 더하십시오.

계정을 삭제할 수있는 경우 문제가 있음을 유의하십시오.

관련 문제