Java List에서 안전하게 항목 삭제하기: 인덱스와 레이스 컨디션
Admin 기능에서 Index 기반 삭제
Admin 기능 에서 공지사항 list 가 있는데 거기에서 원하는 공지사항 item 을 삭제하는 기능을 추가했다. 삭제하려고 할때 index 기반으로 삭제를 하려고 했었다.
그런데 하나 문제가 있었다.
1
[{name: apple, value: xx}, {name: banana, value: xx}, {name: cat, value: xx}, {name: dog, value: xx}]
이 있어서 index 2 를 삭제하고 싶으면 cat 이 삭제가 되는 것이다. 하지만 다시 곰곰이 생각해보니 admin1 과 admin2 두명이 동시에 index 2 를 삭제한다고 하면 cat, dog 이렇게 두개의 정보가 삭제되고 말것이다.. Race Condition 이 생기는 것이다! 어떻게 해결 해야 할까?
list 안에 들어있는 내용까지 확인하여 삭제
제일 정확한 방법으로 안에 있는 name 과 value 의 값들까지 확인하여 삭제하도록 했다. index 2 의 name 은 cat 이기 때문에 삭제 버튼을 눌렀을떄 cat 인지 확인하는 과정도 포함하여 admin2 가 index 2 를 삭제하려고 했는데 name 이 dog 이면 삭제하지 않도록 하였다
하지만…
Admin 기능이라 사실 실사용자는 매우 적다. 사용자가 많아서 이럴 확률이 점점 늘어나면 어떻게 해결해야할지 생각해봤다.
실 사용자가 매우 많고 또 List 처럼 순서를 유지해야한다면 이런 방법이 있을것 같다. 각 항목에 고유한 hash 값을 부여한다. name 과 value 를 합쳐서 16자리 hashvalue 로 만들어 그걸 key 로 사용한다.
1
2
3
4
5
6
{
"17de" : {"name": apple, "value": xx, "index": 0},
"fe90" : {"name": cat, "value": xx, "index": 2},
"0ab3" : {"name": dog, "value": xx, "index": 3},
"9cd1" : {"name": banana, "value": xx, "index": 1},
}
그리고 index 도 안에 들어가 있게 한다음 삭제할때는 hash 값을 기준으로 삭제를 하고. 삭제후에 다시 index 를 refreshing 하면 될거 같다!
This post is licensed under CC BY 4.0 by the author.