자바는 멀티 프로세싱과 멀티 스레딩 Concurrent Programming을 지원한다.
프로세스는 서로 다른 주소 공간을 갖는 상호 독립된 구조를 갖는다. 즉 하나의 프로세스에서 발생한 문제가 다른 프로세스에도 문제를 일으킬 가능성이 적다.
각 프로세는 독립적이므로, 새로운 기능이나 모듈을 추가하거나 수정할 때 다른 프로세스에 영향을 주지 않는다.
전술하였듯 프로세스는 상호 독립된 구조를 갖는다. 따라서 Context Switching이 발생하였을 때 캐시 메모리 초기화 등 작업이 진행될 때 오버헤드가 발생한다.
프로세스는 독립적인 메모리 주소 공간을 가지므로 메모리 사용량이 증가된다. 프로세스간 통신(IPC, Inter-Process Communication)이 필요한 경우, 오버헤드가 발생한다.
하나의 프로세스의 여러 스레드로 자원을 공유하며 작업을 나누어 수행
프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리할 수 있다.
IPC에 비해 스레드 간 통신이 간단하고 시스템 자원 소모가 적다. 또한 스레드는 프로세스 내 스택 영역을 제외한 메모리 영역을 공유하므로 Context Switching이 빠르다.
스레드는 프로세스 내의 힙 영역을 공유하므로 스레드 간 통신이 간단하다.
스레드는 프로세스 내의 자원을 공유하므로 병목현상, 데드락 등 동기화 문제가 발생할 수 있다.
여러 개의 스레드가 병렬적으로 실행되기 때문에, 각 스레드의 동작을 추적하기 어려울 수 있음.
하나의 스레드에 문제가 생기면 전체 프로세스까지 영향이 미칠 수 있다.