스레드와 lock, 메모리 모델까지 지원했다. (저수준 기능을 온전히 활용하기 어려웠다.)
스레드 풀, 병렬 실행 컬렉션 등 강력한 도구 도입
병렬 실행에 도움을 줄 수 있는 fork()/join() 프레임워크를 제공했지만 여전히 개발자가 활용하기는 쉽지 않았다.
혁명 그자체. 이 때부터 확 변했다고 해도 과언이 아니다.
병렬 실행을 새롭고 단순한 방식으로 접근할 수 있는 방법을 제공한다. → 이러한 쉬운 접근 방법을 활용하려면 규칙을 알아야만 한다. 간결한 코드, 멀티코어 프로세서의 쉬운 활용이라는 두 가지 요구사항을 기반으로 한다.
스트림을 이용하면 에러를 자주 일으키며 멀티코어 cpu를 이용하는 것보다 비용이 훨씬 비싼 synchronized를 사용하지 않아도 된다. 또한, 스트림 덕분에 메서드에 코드를 전달하는 간결한 기법 (메서드 참조와 람다), 인터페이스의 디폴트 메서드가 존재할 수 있음을 알 수 있다.
이게 왜 좋은것일까 ?
→ 메서드에 코드를 전달하는 기법을 이용한다면, 새롭고 간결한 방식으로 동작 파라미터화를 구현할 수 있기 때문이며, 자바 8 기법은 함수형 프로그래밍에서 위력을 발휘한다.
inventory.sort(comparing(Apple::getWeight));
리액티브 프로그래밍이라는 병렬 실행 기법을 지원한다. 해당 기법을 사용할 수 있는 상황은 한정되어 잇지만, 수요가 많은 고성능 병렬 시스템에서 특히 인기를 얻고 있는 Rxjava를 표준방식으로 지원한다.
c,c++ 의 경우 안전성은 부족하지만 작은 runtime footprint 덕분에 os 와 임베디드 시스템에서 각광받는다. but lack of safety 때문에 어플리케이션(프로그램)이 예기치 않게 종료되거나 바이러스 등이 공격할 수 있는 보안 구멍이 있다. → 이 안전성 부족은 런타임 풋프린트에 여유가 있는 app에서는 java, c# 같이 안전한 언어가 c,c++을 압도한다.
스트림이란 한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임이다. 즉, 1:1 대응되는 데이터의 집합체다. 이 집합체를 각각으로 보게된다면 동시에 작업을 처리하지만, 집합체로 본다면 1개의 큰 작업을 수행하는 것이다. (쉽게 설명하여, 집합체 - 자동차 공장, 조립 라인 : 각각의 작업)