본문 바로가기
[Java Concurrency] 명시적인 락 13.1. Lock 과 ReentrantLock - Lock 인터페이스는 암묵적인 락과 달리 조건 없는(unconditional)락, 폴링 락, 타임아웃이 있는 락, 락 확보 대기 상태에 인터럽트를 걸 수 있는 방법 등이 포함돼 있으며, 락을 확보하고 해제하는 모든 작업이 명시적이다. - public interface Lock{ void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException; void unlock(); Condition newCondition(); } - Reentran.. 2017. 5. 5.
[Java Concurrency] 활동성 최대로 높이기 #2 [Java Concurrency] 활동성 최대로 높이기 #2 10.2. 데드락 방지 및 원인 추적 - 한 번에 하나 이상의 락을 사용하지 않는 프로그램은 락의 순서에 의한 데드락이 발생하지 않는다. 물론 그다지 실용적이지 않은 방법일 수 있지만, 가능하다면 한 번에 하나 이상의 락을 사용하지 않도록 프로그램을 만들어 보는 것도 좋다. - 여러 개의 락을 사용해야만 한다면 락을 사용하는 순서 역시 설계 단계부터 충분히 고려해야 한다. 설계 과정에서 여러 개의 락이 서로 함께 동작하는 부분을 최대한 줄이고, 락의 순서를 지정하는 규칙을 정해 문서로 남기고 그 규칙을 정확하게 따라서 프로그램을 작성해야 한다. - 세세한 수준에서 락을 관리하는 프로그램에서는 두 단계의 전략으로 데드락 발생 가능성이 없는지를 확.. 2017. 5. 2.
[Java Concurrency] 스레드 풀 활용 [Java Concurrency] 스레드 풀 활용 8.1. 작업과 실행 정책 간의 보이지 않는 연결 관계 - 일정한 조건을 갖춘 실행 정책이 필요한 작업에는 다음과 같은 것들이 있다. 의존성이 있는 작업 스레드 한정 기법을 사용하는 작업 응답 시간이 민감한 작업 ThreadLocal 을 사용하는 작업 - 스레드 풀은 동일하고 서로 독립적인 다수의 작업을 실행할 때 가장 효과적이다. - 특정 작업을 실행하고자 할 때 그에 맞는 실행 정책을 요구하는 경우도 있고, 특정 실행 정책 아래에서는 실행되지 않는 경우도 있다. 다른 작업에 의존성이 있는 작업을 실행해야 할 때는 스레드 풀의 크기를 충분히 크게 잡아서 작업이 큐에서 대기하거나 등록되지 못하는 상황이 없도록 해야 한다. 스레드 한정 기법을 사용하는 작업.. 2017. 4. 27.
[Java Concurrency] 중단 및 종료 #1 [Java Concurrency] 중단 및 종료 #1 - 작업이나 스레드를 안전하고 빠르고 안정적으로 멈추게 하는 것은 어려운 일이다. 더군다나 자바에는 스레드가 작업을 실행하고 있을 때 강제로 멈추도록 하는 방법이 없다. 대신 인터럽트(interrupt)라는 방법을 사용할 수 있게 되어 있는데, 인터럽트는 특정 스레드에게 작업을 멈춰달라고 요청하는 형태이다. 실제 상황에서 특정 스레드나 서비스를 "즉시" 멈춰야 할 경우는 거의 없고, 강제로 종료하면 공유되어 있는 여러 가지 상태가 비정상적인 상태에 놓일 수 있기 때문에 스레드 간의 협력을 통한 접근 방법이 올바르다. 다시 말해, 작업이나 서비스를 실행하는 부분의 코드를 작성할 때 멈춰달라는 요청을 받으면 진행 중이던 작업을 모두 정리한 다음 종료하도록.. 2017. 4. 25.
[Java Concurrency] 작업 실행 [Java Concurrency] 작업 실행 - 앱이 해야 할 일을 "작업"이라는 단위로 분할하면 프로그램의 구조를 간결하게 잡을 수 있고, 트랜잭션의 범위를 지정함으로써 오류에 효과적으로 대응할 수 있고, 작업 실행 부분의 병렬성을 자연스럽게 극대화 할 수 있다. 6.1. 스레드에서 작업 실행 - 프로그램에서 일어나는 일을 작업이라는 단위로 재구성하고자 한다면 가장 먼저 해야 할 일은 작업의 범위를 어디까지로 할 것인지 정하는 일이다. 원론적으로 보자면 작업은 완전히 독립적인 동작을 말한다. 독립성이 갖춰져 있어야 병렬성을 보장할 수 있다. 작업을 스케쥴링하거나 부하 분산(load balancing)을 하고자 할 때 폭넓은 유연성을 얻으려면 각 작업이 앱의 전체적인 업무 내용 가운데 충분히 작은 부분을.. 2017. 4. 24.
반응형