
큐는 내가 처리한 데이터 대부분이 줄을 세워서 순차적으로 처리가 된다. 큐를 구현할때 배열, 링크드 리스트로 구현하는 방법, 여러개가 있겠지.. 알아야할 것은 큐다.
어떠한 프로그램을 돌리는데 같은 것을 수 없이 함. 프로세스에 올리면 영역을 계속 같은 걸 써야하잖아 감당이 안되기 떄문에 등장한 개념이 스레드.
스테틱, 힙, 코드를 공유함. 별도로 안 잡아도 됨.
하지만 스택 영역은 동작과 밀접한 연관이 있기 때문에 같이 잡을 수가 없다. 레지스터도 공유 불가능.
스레드를 쓰면 문제는 static, heap은 공유한다. static 영역을 공유하면 여러 코드가 한꺼번에 공유 영역에 접근할 수 있음. 스레드 1이 참고 중인 영역을 스레드2가 바꿔버리면 문제가 생긴다.
그래서 생긴 개념이 락
어떠한 자원을 액세스하는데 일정한 시간에 두 개 이상이 액세스하지 못하게 만든다.
1. 싱크로나이즈드: 이게 붙어있는 영역은 동시에 접근이 안된다. 특정한 블록이나 메소드 구간에는 하나의 스레드만 들어갈 수 있다.
2. 락: 라이브러리 만들어져 있음. 여러 구간을 거쳐서 하나의 동일한 보호 구역으로 지정한다. 그래서 락은 별도의 객체로 만들어서 사용한다.
wait() : 주차 타워에서 차를 기다리는 동안 아무것도 못한다고 하면 답답하잖아.. 그동안에 다른 걸 할 수 있도록 대기하라고 대기 리스트에 넣어주는 거임. 싱크로나이즈 블럭 내에서만 가능함.
notify() : wait을 깨워주는 함수. notify를 하면 대기 중인 한 개 이상의 스레드 중 한 개를 랜덤하게 깨운다. notifyAll은 다 깨우고 하나만 사용하고 나머지는 다 대기 상태로 돌아감.