컴퓨터/이론: 개발
[2017.11.15] 28. Thread-safe List (CopyOnWriteArrayList) 실습1
heepie
2017. 11. 15. 20:50
도입
이번 포스팅에서는 예전부터 궁금했던 Thread의 병렬처리로 인한 객체나 자료형에 동시접근과 관련한 궁금증을 해결할 예정이다.
Thread의 병렬처리와 Thread-safe한 List인 CopyOnWriteArrayList로 실습할 예정이다.
궁금증
우선, Thread-safe한 List에 접근은 많은 Thread가 접근하려고 해도 1개의 Thread의 접근이 완료된 후 다른 Thread의 접근이 가능하다.
여기서 궁금증은 List의 독점 사용은 Thread가 코드 중 List에 접근할 때만 유효한가? 아니면 해당 Thread가 끝날 때까지 유효한가? 이다. 그림으로 표현하면
해당 코드에서만 독점 |
Thread가 끝날 때까지 독점 |

|
|
실습
Thread1과 Thread2를 생성한다.
Thread 1의 역할 |
Thread 2의 역할 |
1. CopyOnWriteArrayList에 데이터 10개 입력 2. 5초 Sleep 후 현재 데이터 개수 출력 3. CopyOnWriteArrayList에 추가 데이터 10개 입력 |
1. 3초 Sleep 후 CopyOnWriteArrayList의 Size()-1만큼 데이터 제거
|
이 결과, Thread1의 2에서 현재 데이터 개수를 출력했을 때, 1개라면 해당 코드에서만 독점, 10개라면 Thread가 끝날 때까지 독점이라는 것을 판단할 수 있다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | public class MainActivity extends AppCompatActivity { private CopyOnWriteArrayList<String> threadSafeList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); threadSafeList = new CopyOnWriteArrayList<>(); } // Thread 1 public void onAdd(View view) { new Thread() { public void run() { // 임의값 10개 입력 for (int i = 0; i < 10; i = i + 1) { threadSafeList.add(i + ""); Log.i("heepie", "Thread1 Add size: " + threadSafeList.size()); } // 5초 Sleep 후 현재 개수 반환 try { Thread.sleep(5000); Log.i("heepie", "Thread1 Result size: " + threadSafeList.size()); } catch (InterruptedException e) { e.printStackTrace(); } for (int i = 0; i < 10; i = i + 1) { threadSafeList.add(i + ""); } } }.start(); } // Thread 2 public void onRemove(View view) { new Thread() { public void run() { // 3초 Sleep 후 List의 size()-1개만큼 값 제거 try { Thread.sleep(3000); for (int i = 0; i < threadSafeList.size()-1; i = i + 1) { threadSafeList.remove(i); Log.i("heepie", "Thread2 Remove size: " + threadSafeList.size()); } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } } | cs |
스크린 샷

결론
List의 독점 사용은 Thread가 코드 중 List에 접근할 때만 유효하다.
#CopyOnWriteArrayList #Thread safe #Thread 병렬 #Thread safe List