시작 이전의 AtomicLong 클래스의 updateAndGet 메소드를 사용해 한 인스턴스를 여러 스레드에서 안전하게 사용하는 법을 공부했었다. 그런데 동일한 원자값을 접근하는 스레드가 많은 경우에는 원자값을 사용중인지에 대해 검사를 엄청 해야하므로 성능이 떨어진다. 이럴땐 LongAdder와 LongAccumulator 클래스를 이용한다. LongAdder LongAdder 클래스는 각각을 모두 합하면 현재값이 되는 여러 변수로 구성되어있다. 여러 스레드가 서로 다른 인스턴스 변수를 업데이트하고 스레드가 증가하면 새로운 인스턴스가 제공된다. 즉 모든 스레드에 각각 다른 인스턴스 변수를 제공함으로써 경쟁을 줄이고 여러 스레드가 한 인스턴스 변수를 수정하는 일이 없도록 하는 것이다. LongAdder의 ..
자바8에서는 병렬 해쉬맵을 편하게 사용하기 위한 메소드가 추가되었다. Compute (key, (key, value)->value와 같은타입 리턴) 이 메소드는 키와 새로운 값을 계산하는 함수를 전달받는다. 두번째 인자로 받는 함수는 키와 값을 파라미터로 받아 값을 계산하고, 그 값을 리턴(적용) 한다. ex) map.compute(key, (k,v)->v.trim()); 위의 예제는 첫번째 인자로 받은 key와 매핑된 값의 공백을 없애주는 역할을 한다. 이 메소드의 개념은 수정(갱신)이라 봐도 무방할 것 같다. computeIfAbsent (key, key->value) 이 메소드는 키와 키를 받아 값 타입을 리턴하는 함수를 인자로 받는다. 만약 첫번째 인자로 받은 키와 매핑된 값이 존재하지 않으면 두..
이전에는 동기적 연산에서 예외를 제어하는 것을 봤었다. 이번에는 비동기적 연산에서 각 쓰레드에서 예외를 제어해보겠다. 동기적 연산에서는 그냥 코드들을 다 묶어서 예외처리를 해버렸다. 하지만 비동기연산에서는 호출자에게 예외를 넘기지 않아 호출자에서 예외를 처리할 수가 없다. 이럴 경우 스스로 예외를 처리해야한다. 나는 이 문제의 해결을 위해 BiFunction 타입을 선택했다. 이 타입은 Runnable과 Consumer 타입을 각각 인자로 받아 Runnable 타입을 리턴하는 함수를 지칭한다. public static void parallelTest(Runnable run1 , Runnable run2, Consumer con){ BiFunction bi = (run, consumer)->{ return..
자바8에서는 메소드에서 함수도 리턴할 수 있다.이전에 했던 파일필터를 약간 변형하여디렉토리이면서 이름이 4글자 이상인 파일명을 필터링하는 함수를 리턴하는 메소드를 만들어보겠다 public static Predicate checkDirectory(int minLength){return file->file.getName().length() > minLength && file.isDirectory();} public static void main(String[] arg){File[] fileList = new File("경로").listFiles();Predicate filter = file->file.isDirectory();int minLength = 4;List directories = Arrays.st..
특정 기준을 만족하는 파일들을 처리하는 메소드를 작성하려면 FileFilter 클래스보다는 Predicate 을 추천한다. public static void main(String[] arg){ File[] fileList = new File("경로").listFiles(); List directories = Arrays.stream(fileList) .filter(file->file.isDirectory()) .collect(Collections.toList()); } 이러면 directories 변수에는 fileList에서 디렉토리만 걸러진 결과가 들어가게 된다. stream의 filter 메소드는 Predicate 타입을 인자로 받으므로 아래와 같이도 가능하다. public static void ma..
AtomicLong 클래스의 incrementAndGet 메소드는 값을 증가시키고 증가된 값을 리턴한다. 이 메소드는 다수의 스레드가 같은 인스턴스를 동시에 접근해도 방해를 받지 않는다. 즉 올바른 값이 계산되어 리턴됨을 보장받는 메소드이다. 하지만 값을 증가시키는 것 외에 더 복잡한 연산을 수행하기엔 적절하지 않다. 예를 들어 여러 스레드가 주시하는 값들 중 가장 큰 값을 얻으려한다. public static AtomicLong number = new AtomicLong(); number.set(Math.max(number.get()), observed); 위 예제에서 두번째 줄을 여러 스레드가 동시에 실행된다면 경쟁조건에 의해 오류가 발생될 것이다. 이 연산을 사용하려면 compareAndSet 메소..
Instant가 컴퓨터의 절대시간을 돌려줬다면LocalDate 클래스는 인간이 사용하는 시간(연, 월, 일)을 돌려준다.현재시간을 불러오는 방법은 Instant와 같다. LocalDate now = LocalDate.now(); 또한 특정날짜를 불러오려면 LocalDate 입대일 = LocalDate.of(2014, 11, 24); //오래된거 같은데... 이렇게 불러올 수 있다. 또한 날짜계산도 쉽게 할 수 있다. LocalDate 전역일 = LocalDate.of(2014, 11, 24).plusDays(730); //ㅠㅠ LocalDate의 메소드들은 아래와 같다. 메소드 설명 now, of 현재 시각, 주어진 연,월,일로부터 LocalDate를 생성(static) plusDays, plusWeek..
Instance와 Duration의 공통 메소드 plus, minus : 인자로 주어진 기간을 더하거나 뺀다. plusNanos, plusMillis, plusMinutes .... plusDays : 주어진 시간단위의 수만큼 날짜를 더한다minus도 같다. 주어진 시간단위의 수만큼 날짜를 뺀다. Duration의 메소드isZero : Duration이 0인지 검사한다isNegative : Duration이 음수인지 검사한다. * Instant와 Duration 클래스는 수정불가이므로 모든 메소드에서 Instant나 Duration을 리턴할 땐새로운 객체를 리턴한다.
자바의 Instant는 타임라인의 한 시점을 나타낸다.Instant.MIN의 값은 10억년 전이고, Instant.MAX의 값은 1,000,000,000년 12월 31일이다. 현재의 시간을 받아오려면 정적메소드인 Instant.now() 를 사용한다.이 now() 메소드는 현재 시간의 Instant 객체를 반환한다. 두 인스턴트의 시간차를 알려면 Duration 클래스의 정적 메소드 between을 사용한다. Instant time1 = Instant.now();Instant time2 = Instant.now();Duration time = Duration.between(time1, time2);long milliSecond = time.toMillis(); 위의 예제의 milliSecond 변수에는 ..
지연실행은 코드를 바로 실행하지 않고 코드 실행을 필요로 할 때 실행하도록 하는 것이다.코드를 나중에 실행하는 이유는 다음과 같다. - 별도의 스레드에서 코드 실행- 코드를 여러번 실행- 적절한 시점에 실행- 어떤 일이 발생(이벤트)했을 때 실행 책의 예제를 보자면 logger.info("x : " + x + ", y : " + y ); 이 코드를 실행하면 먼저 문자열을 조립하고 info 메소드를 호출하면서 조립된 문자열을 인자로 전달한다.하지만 로그레벨이 info 메세지를 기록하지 않도록 로그레벨이 설정되어 있다면문자열을 조립하는 불필요한 연산을 수행하게 된 것이다. 이 예제를 필요할 때(로그에 기록될 때)에만 코드를 실행하게 하려면1. 람다를 받는다2. 호출해야 하는지 검사한다.3. 필요할 때 람다를..
- Total
- Today
- Yesterday
- 자바 성능
- 날짜
- 코어
- 성능
- Jackson
- RAMDA
- 알람
- opensource
- gitlab
- Stream
- Swift 2.0
- 자료구조
- Docker
- 퍼포먼스
- react
- javascript
- 프로세서
- 시간
- rambda
- 컴퓨터 시간
- Java8
- json
- Java
- 리액트
- 메모리
- 람다
- 클로저
- 자바
- 성능개선
- Clojure
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |