동기방식(Vector) vs 비동기 방식(ArrayList)
동기방식
요청을 보낸 후, 응답을 받아야 다음 과정이 동작하는 방식
동기 방식에서는 한 작업이 완료될 때까지 다른 작업은 대기한다. 이는 작업 간의 의존성을 관리할 수 있게 하며, 데이터의 일관성을 유지할 수 있다.
자바에서는 synchronized 키워드를 사용하여 동기화를 구현할 수 있다.
Vector는 대부분의 메소드에 synchronized 키워드를 사용하여 동기화하였다.
동기 방식은 다른 방식보다 더 안정적이지만, 작업이 순차적으로 실행되기 때문에 처리 시간이 더 오래 걸릴 수 있다. 따라서 대규모 처리가 필요한 경우에는 비동기 방식을 고려해야 한다.
비동기 방식
요청을 보낸 후, 응답과는 상관 없이 다음 과정이 동작하는 방식
Thread-safe?
멀티 스레드 환경에서 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻함
위의 영상에서 vector는 완전하게 thread-safe하지 않다고 말한다.
아래의 코드와 remove() 메소드가 동시에 실행되면 프로그램이 종료된다는 것이 이유 같은데 오류가 발생하는 정확한 코드는 공개를 하지 않았다.
if (vector.size() > 0) {
System.out.println(vector.get(0));
}
그래서 간단하게 코드를 구현해봤다.
멀티스레드에 대한 지식이 너무너무너무 얕기 때문에 어떻게 코드를 짜야할 지 모르겠다.
아래의 코드를 실행하면 ArrayIndexOutOfBoundsException
이 발생하고 프로그램이 종료된다.
Vector<Integer> vector = new Vector<>();
vector.add(1);
Thread thread1 = new Thread(() -> {
if (vector.size() > 0)
for (int i = 0; i < 100; i++)
System.out.println(vector.get(0));
});
Thread thread2 = new Thread(() -> {
vector.remove(0);
});
thread1.start();
thread2.start();
thread1 에서 vector의 첫번째 요소를 출력하고 있음과 동시에
thread2 에서 vector의 요소를 삭제해버려서 vector가 비어버렸기 때문이다.
이건 그냥 코드의 문제가 아닌가?
만약에 출력문을 100번 반복한 이후에 요소를 삭제하고 싶다면 스레드 실행문 자체를 동기화 해야 하는 것이 맞지 않나 싶다.
public class Thread1 extends Thread{
final Vector<Integer> vector;
Thread1(Vector<Integer> vector) {
this.vector = vector;
}
@Override
public void run() {
synchronized (vector) {
if (vector.size() > 0)
for (int i = 0; i < 100; i++)
System.out.println(vector.get(0));
}
}
}
public class Thread2 extends Thread{
final Vector<Integer> vector;
Thread2(Vector<Integer> vector) {
this.vector = vector;
}
@Override
public void run() {
vector.remove(0);
}
}
Vector<Integer> vector = new Vector<>();
vector.add(1);
Thread1 thread1 = new Thread1(vector);
Thread2 thread2 = new Thread2(vector);
thread1.start();
thread2.start();
이런 식으로 수행하면 아무런 문제가 되지 않는다.
음,, 나중에 멀티스레드에 대한 지식이 쌓이면 다시 확인해봐야겠다
'의문과 실험' 카테고리의 다른 글
Model이 DTO의 존재를 모르게 하라? Model과 DTO (0) | 2023.07.11 |
---|---|
[Java] 싱글톤과 Static은 뭐가 다를까? (0) | 2023.07.03 |
[JAVA] 자바는 Call by Reference 지원 안해. 참조변수를 넘기는 경우는 뭘까? (0) | 2023.04.04 |
[JAVA] 오라클 공식 문서에도 없는 String pool은 도대체 무엇인가? (0) | 2023.04.03 |
[JAVA] int num = 1; num이 가리키는 메모리는 '값'을 가지는가? (0) | 2023.04.02 |