라벨이 Java 소스 분석인 게시물 표시

(Java 소스 분석) Fork Join Framework

이미지
*Arrays클래스의 sort메소드를 보던 중, parallelSort()라는 메소드를 보게 되었다. 이 정렬 메소드는 DualPivotQucikSort를 사용하여 일반 sort()메소드와 같지만, 다중 스레드를 사용할시 훨씬 좋은 정렬 성능을 보인다고 나와있다. 특히, 메소드 안에 다음과 같은 조건이있다. p = ForkJoinPool.getCommonPoolParallelism()) == 1  ForkJoinPool은  기본 개념은 큰 업무를 작은 업무 단위로 쪼개고, 그것을 각기 다른 CPU에서 병렬로 실행한후 결과를 취합하는 방식이다. 마치   분할정복 알고리즘 과 흡사하다. 여러 CPU들을 최대한 활용하면서 동기화와 GC를 피할수 있는 여러 기법이 사용되었기 때문에, Java 뿐 아니라 Scala에서도 널리 쓰이고 있는 병렬처리 기법이다.  또한 C,C++을 위한 Thread Building Block(TBB) 나 C#의 Task Parallel Library또한 Fork Join Framework의 개념을 가지고 있다. *ForkJoinPool의 절차를 조금 더 보자면 1) 큰 업무를 작은 단위의 업무로 쪼갠다. 2) 부모 쓰레드로부터 처리로직을 복사하여 새로운 쓰레드에서 쪼개진 업무를 수행(Fork)시킨다. 3) 2을 반복하다가, 특정 쓰레드에서 더 이상 Fork가 일어나지 않고 업무가 완료되면 그 결과를 부모 쓰레드에서 Join하여 값을 취합한다. 4) 3을 반복하다가 최초에 ForkJoinPool을 생성한 쓰레드로 값을 리턴하여 작업을 완료한다. <ForkJoinPool의 성능의 핵심 : Work-Stealing> 기본적으로는 newCachedThreadPool이나 newFixedThreadPool 처럼 ExecutorService의 구현체이다. 그러나 일반 ExecutorService 구현 클래스와는 기본적으로 다른 점이 하나 존재한다. 바로...

(Java 소스 분석) String 클래스

*String 클래스는 public final class 로 되어 있다. 또한 값 비교를 위한 Comparable<String>을 구현하고 있다. *특히, 문자열을 저장하기 위해  private final char value[]; 로 되어있는데 final로 되어 있기 때문에 초기값 이후 값을 변경할 수 없다. 즉 새로운 문자열을 붙일 경우 새로운 객체를 생성해야 한다는 것을 알 수 있다. 반면에 StringBuffer은 final로 되어 있지 않다. 대신 transient가 붙어 있어 직렬화가 불가능하다. *compareTo메소드는 문자열의 길이만을 비교한다.

(Java 소스 분석) List 인터페이스

 참고 하면 좋은 사이트 https://www.tutorialspoint.com/java/util/arraylist_toarray.htm *interface로 구현 됨 <추상메소드> 1. int size() 2. boolean isEmpty() 3. boolean iscontains(Object o) 4. Iterator<E> iterator(); 5. Object[] toArray() - Array로 바꾸는 메소드 6. boolean add(E e) - 현재 element 의 끝에 붙이는 메소드 7. boolean remove(E e)- 첫 번째 element를 제거하는 메소드, element가 존재한다면 8. boolean containsAll(Collection<?> c) - 특정한 collection타입 요소들을 모두 포함하고 있을 때 true를 리턴함 9. boolean addAll(Collection<? extends E> c) - 10. boolean addAll(int index, Collection<? extends E> c) - 특정 지점 부터 c 데이터들을 모두 집어넣는 메소드 11. boolean removeAll(Collection<?> c) - 모든 요소들을 삭제하는 메소드 12. boolean retainAll(Collection<?> c)-