일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- cloud native java
- 동기화
- Algorithm
- Microservice
- devops
- 자바
- decorator 패턴
- Stress test
- 쿠버네티스
- 헬름
- MySQL
- Kotlin
- 익명클래스
- cloud native
- nGrinder
- java
- 클라우드 네이티브
- 머신러닝
- 마이크로서비스
- kubernetes
- Spring
- CRD
- ansible
- 클라우드 네이티브 자바
- Semaphore
- MSA
- spring microservice
- Adapter 패턴
- ingress
- 코틀린
- Today
- Total
목록java (15)
카샤의 만개시기
실제 결과가 필요한 시점보다 훨씬 이전에 시간이 많이 필요한 작업을 미리 해두는 용도로 사용합니다. FutureTask는 시작 전 대기, 시작됨, 종료 3가지 상태로 구분할 수 있고 한번 종료상태가 되면 더 이상 상태가 바뀌지 않습니다. Future.get()메소드는 FutureTask의 작업이 종료되면 그 결과를 즉시 알려줍니다. class MyRunnable implements Runnable { private final long waitTime; public MyRunnable(int timeInMillis) { this.waitTime = timeInMillis; } @Override public void run() { try { Thread.sleep(waitTime); System.out.pr..
두 쓰레드 간에 인스턴스를 교환해주는 역할로 사용합니다. 예제를 통해서 알아보도록 하겠습니다. 메모리를 할당하는 A 쓰레드와 메모리를 해제하는 B 쓰레드가 있다고 할 때 A는 자신의 스택에 계속 데이터를 추가하고 쌓여있는 메모리를 해제하기 위해 A는 B와 스택을 교환하게 되고, 그러면 B는 교환 된 스택을 전부 비웁니다. public final static int MAX_STACK_CNT = 8; private Exchanger exchanger = new Exchanger(); class PushThread implements Runnable { LinkedList stack = new LinkedList(); private Scanner sc = new Scanner(System.in); public..
실행중인 쓰레드 내부 원하는 지점에서 대기를 걸어주고 CyclicBarrier 생성자의 파라미터로 넘겨준 값 만큼 await()을 호출하면 대기하고 있던 쓰레드들의 대기를 풀어주는 동작을 할 수 있습니다. private static final int THREAD_CNT = 5; private CyclicBarrier cyclicBarrier = new CyclicBarrier(THREAD_CNT); public class SleepThread implements Runnable { private int id = 0; private Random random = new Random(System.currentTimeMillis()); public SleepThread(int id) { this.id = id;..
백그라운드로 스레드가 돌아가고 있는 상황에서 해당 스레드가 종료 되기를 기다려야 하는 상황이 있을때 Thread 클래스의 join() 함수를 이용하면 됩니다. 그렇지만 하나가 아닌 여러 스레드들이 종료되기를 기다려야 하는 상황이 발생된다면 CountDownLatch를 고려할 수 있습니다. private static final int THREAD_CNT = 10; private CountDownLatch lacth = new CountDownLatch(THREAD_CNT); public class SleepThread implements Runnable { private int id = 0; private static Random random = new Random(System.currentTimeMill..
리소스에 접근할 수 있는 스레드의 수를 제한할 때 사용합니다. acquire() 메소드를 통하여 접근 권한을 퍼밋(Permit)받고, 남은 퍼밋이 없을 경우 퍼밋이 생기거나 인터럽트가 발생되거나 타임아웃이 걸리지 전까지 대기합니다. release() 메소드는 확보했던 퍼밋을 다시 세마포어에게 돌려주는 메소드입니다. 세마포어에 대해서 자세히 알고 싶다면 다음 글을 참고해주세요 세마포어(Semaphore)와 뮤텍스(Mutex) class ShareResource { private final Semaphore semaphore; private final int MAX_PERMIT_CNT; public ShareResource(int cnt) { this.semaphore = new Semaphore(cnt);..
싱글 스레드와 달리 멀티 스레드 프로그래밍 방식에서는 고려해야 할 것이 많다. 그 원인은 경쟁 상태(race condition)와 변수의 가시성(visibility)에서 온다. 경쟁 상태 여러 스레드 같은 시점 변수를 읽는 상태 변수의 가시성 변수들이 사용될 수 있는 영역의 범위로써 변수의 값이 CPU의 캐시 메모리에 저장되어 있는지, 메인메모리에 저장되어 있는지 알 수 없다는 데에서 온다. 동일한 변수를 동시에 접근 했을때 어떤 스레드는 캐시 메모리에 접근 할수도 있고 어떤 스레드는 메인 메모리에 접근할수도 있기 때문이다. Atomic java.concurrent.atomic 패키지를 보면 원자적 연산을 수행 할 수 있는 클래스들이 있다. Atomic 클래스들은 CAS(compare-and-swap) ..
OSGI (Open Service Gateway initiative) OSGI의 핵심 개념은 프로그램을 만들 때 하나의 큰 프로그램으로 만들지 않고 여러 가지의 작은 프로그램을 만든 후 이것을 하나로 묶어 내는 것입니다. OOP가 클래스를 모듈화 시키는 것이라고 했을때, OSGI는 아예 프로그램 자체를 모듈화(OSGI에서는 이것을 번들(bundle)이라고 부릅니다.) 하고, OSGI Framework에서 이 모듈들을 각각 등록시키고 요청에 따라 실행을 시키게 됩니다. OSGI의 장점은 다른 모듈의 코드를 전혀 신경쓰지 않아도 된다는 것이며, Input과 Output의 형태만 유지시켜주면 코드 변경으로 인한 오류가 일어날 걱정을 하지 않아도 된다는 것 입니다. 또한 가장 큰 특징으로 OSGI의 life c..
인터페이스는 직접 객체화할 수 없기 때문에 구현 클래스를 이용하는데 일회성으로 사용하는 구현 클래스를 계속 선언하는 것은 비효율적이기 때문에 익명 클래스나 람다를 이용하여 구현 클래스를 선언합니다. 익명 클래스 익명 클래스는 코드가 너무 길어 함수형 프로그래밍 방식에 적합하지 않습니다. 익명 클래스에 대해 알고 싶다면 다음 글을 참조해주세요. 중첩클래스 (내부클래스, 정적 중첩클래스, 지역클래스, 익명클래스) 함수 객체 (Function Object) 특정 동작을 목적으로 추상 메서드를 하나만 담은 인터페이스나 추상 클래스를 함수 객체라합니다. 람다 JDK 1.8 이후로는 함수 객체의 인스턴스를 람다식으로 만들어 사용할수 있습니다. Collections.sort(list, new Comparator() ..