Singleton - LazyHolder

Singleton - LazyHolder

소프트웨어 디자인 패턴에서 싱글턴 패턴을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다

 

Singleton 구현방법

 

  1. 기본적인 Singleton 구현방법 (Thread-Safe)

getInstance method 로 인스턴스로 가져올때 마다 synchronized 키워드로 인해 동기화 과정에서 Lock으로 인한 성능 저하가 생길 수 있음

이리하여 DLC(Double-Checked-Locking) Singleton 으로 진화하게 됨

 

  1. DLC(Double-Checked-Locking) Singleton

DLC Singleton과 같은 경우는 멀티쓰레드 환경에서 컴파일러에 따라 재배치(reordering)문제를 야기할 수도 있다는데,

어느 블로그가 정리한 내용을 빌려오자면

소스코드가 논리적으로 문제가 없지만 컴파일러에 따라서 재배치(reordergin)문제를 야기한다.

위에 소스가 컴파일 되는 경우 인스턴스 생성은 아래와 같은 과정을 거치게 된다.

멀티쓰레드 환경일 경우 각 스레드마다 동일 메모리를 공유하는 것이 아닌 별도 메모리 공간에서 변수를 읽어온다. 이런 경우 각 스레드마다 동일한 변수의 값을 다르게 기억할 수 있다. 만약 Thread A가 인스턴스 생성을 위해서 instance = some_place;를 수행하는 순간 Thread B가 Test.getInstace()를 호출하게 되면 아직 실제로 인스턴스가 생성되지 않았지만, Thread B는 instance == null 의 결과가 false로 리턴되어 문제를 야기하게 된다.

 

  1. Initialization on demand holder idiom (holder에 의한 초기화)

개발자가 직접 동기화 문제에 대해 코드를 작성하고 문제를 회피하려 한다면 프로그램 구조가 그 만큼 복잡해지고 비용 문제가 생길 수 있고 특히 정확하지 못한 경우가 많다.(100%가 아닐수 있음)

그런데 이 방법은 JVM의 클래스 초기화 과정에서 보장되는 원자적 특성을 이용하여 싱글턴의 초기화 문제에 대한 책임을 JVM에 떠넘긴다.

holder안에 선언된 instance가 static이기 때문에 클래스 로딩시점에 한번만 호출될 것이며 final을 사용해 다시 값이 할당되지 않도록 만든 방법.

가장 많이 사용하고 일반적인 Singleton 클래스 사용 방법이다.

 

'Java' 카테고리의 다른 글

2. 객체지향 언어 특징  (0) 2018.07.26
1. Java란  (0) 2018.07.26
2. 변수자료형연산자  (0) 2017.03.16
1. 기본 입출력  (0) 2017.03.16
TCP - 흐름제어 , 혼잡제어

TCP 프로토콜 - (흐름제어 와 혼잡제어)

일단 흐름제어와 혼잡제어는 네트워크 트래픽에 관한 기술 입니다.

 

  • 흐름제어(Flow Control)

    송신측과 수신측의 데이터 처리 속도 차이를 해결하기 위한 기법

 

  • 혼잡제어(Congestion Control)

    송신측의 데이터 전달과 네트워크의 데이터 처리 속도 차이를 해결하기 위한 기법

 

흐름제어

수신측이 송신측보다 빠른건 문제가 없지만, 송신측이 수신측보다 빠를 때, 데이터 손실이 일어날 수 있음, 그래서 송신측의 데이터 전송량을 수신측에 맞춰야합니다.

수신측에 데이터 전송량을 맞추는 2가지 방법

1.Stop and Wait 방식

말그대로 매번 패킷을 보낼 때마다, 확인을 한 후, 다음 패킷을 전송하는 방법

image

2.Sliding Window

3 Way Handshake 를 하면서 수신측이 송신측의 윈도우 크기를 정해준다

먼저 송신측에서 윈도우 크기만큼 패킷을 보낸 다, 그 후 수신측에서 응답을 하면 윈도우를 이동시킨다.

 

여기서 송신측이 window를 이동시키는 방법은 2가지가 있는데,

하나는 Go Back N 방식 과 Selective-Reject 방식이 있다

Go Back N ARQ

이 친구는 예를 들어 1 ~ 5번 패킷을 전송 했는데, 만약 2번 패킷이 손실되었다고 수신측이 말한다면 , 2번 부터 다시 쭈루루룩 보내는 것을 말한다

Selective-Reject ARQ

이 친구는 예를 들면 1 ~ 5번 패킷을 전송 했는데, 만약 2번 패킷이 손실됬다! 그러면 2번 패킷만 다시 재전송 하는 친구이다.

 

image

 

 

혼잡제어

네트워크 내의 패킷의 수가 과도하게 증가하는 현상을 혼잡(Congestion)이라 하는데 이를 방지하기 위한 것이 혼잡제어 이다. 혼잡제어 알고리즘(AIMD - Additive Increate / Multicative Decrease)에 3가지를 설명하면

  1. Slow Start - window size를 1씩 늘려준다 ===> 즉 한 주기가 끝나면 , 크기가 2배가 되며 지수함수 꼴로 증가

    만약 혼잡현상이 발생시 windows size를 1로 줄인다

  2. Fast Retransmit(빠른 재전송) - 만약 수신측에서 패킷 손실로 인해 재전송 요청을 중복패킷에 대해 3개 받으면 , 혼잡한 상황이라 생각하여 windows size를 줄인다

  3. Fast Recovery(빠른 회복) - 혼잡제어가 발생할 때, window size의 크기를 반으로 줄이며, window의 크기를 선형 증가 시킨다

image

 

 

 

 

 

 

'네트워크' 카테고리의 다른 글

SSL 동작과정  (0) 2020.08.19
3&4 Way Handshake  (0) 2020.08.19
Post와 GET의 차이  (0) 2018.03.11
3 & 4 way handshake

3 - Way Handshake & 4 - Way Handshake (TCP / UDP)

3 Way Handshake 와 4 Way Handshake는 TCP 프로토콜에서 호스트 간 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정이다

 

그럼 여기서 TCP 와 UDP가 무엇인지 간단하게 알고 가보자

TCP

  • 연결형 서비스를 지원하는 전송계층 프로토콜
  • 인터넷 환경에서 기본 사용
  • 호스트간 신뢰성 있는 데이터 전달(연결형 서비스니까 !)흐름제어혼잡제어 등을 제공하는 전송 계층 (데이터 흐름 제어)
  • 호스트 간의 연결의 설정(3 way handshake)과 해제(4 way handshake)

 

여기서 중요한 흐름제어혼잡제어를 꼭 알아야 한다! ==> 요 건 링크

 

UDP

  • 비연결형 서비스를 지원하는 전송계층 프로토콜
  • 사용자 데이터그램형 프로토콜
  • TCP와는 달리 연결의 설정과 해제(3 way handshake & 4 way handshake) 과정이 없음
  • 송신측에서 수신측이 데이터를 잘받았는지 확인하지 않고, 일방적으로 데이터를 보내기만 함

 

image

 

일단 미리 알아두어야 할 것은 클라이언트와 서버간의 서로 통신하기 위해 두 종류의 패킷(ACK , SYN)을 보낸다

일단 패킷들의 종류를 몇가지 알아보면

CWR : 송신자의 자신의 윈도우 사이즈를 줄인다.

ECE : 혼잡 감지 시 수신자가 ECE를 설정하여 송신자에게 알린다.

URG : Urgent Point 필드와 함께 사용되고 플래그 설정 시 TCP는 해당 세그먼트를 전송 큐의 제일 앞으로 보낸다.

ACK : SYN에 대한 확인의 의미이다. 3 way handshake에서의 syn과 reset을 제외하고 모든 세그먼트에 ACK가 설정

PSH : 일반적으로 모든 데이터를 전송하고 마지막에 보내는 신호로 수신측은 데이터를 즉시 전송하라는 의미

RST : 송신자가 유효하지 않은 연결을 시도할 때 거부하는데 이용되고 또한 통신의 연결 및 종료를 정상적으로 할 수 없을 때 사용

SYN : 통신 시작 시 연결을 요청하고 ISN(순서번호)을 교환

FIN : 데이터 전송을 종료

 

3 Way HandShake

흐름을 설명하자면

  1. Client는 맨 처음 close 상태이며 , Server와 연결하기 위해 SYN을 보낸다
  2. Server는 맨 처음 Listen 상태이며, SYN을 받고, 그거에 대한 ACK를 보내고 , Client도 포트를 열어 달라고 SYN을 보낸다
  3. Client가 Server의 ACK 와 SYN을 받고(여기서 클라는 established상태), SYN에 대답으로 ACK를 보낸다,
  4. Server가 마지막으로 ACK를 받으면 established로 상태가 변경되며 , tcp 연결이 완료된다

image

Closed : 닫힌 상태

LISTEN : 포트가 열린 상태로 연결 요청 대기 중

SYN_RCV : SYNC 요청을 받고 상대방의 응답을 기다리는 중

ESTABLISHED : 포트 연결 상태


 

4 Way Handshake

  1. Client가 연결을 종료하겠다는 FIN플래그를 전송한다.

  2. Server는 FIN플래그를 받은 다음 플래그에 대한 ACK를 보낸 후 TIME_WAIT 상태가 된다.

    (FIN을 받았지만 , Client가 보낸 패킷이 라우팅 지연이나 패킷 손실의 이유로 재전송을 보낼 수 있는데, 이 때 FIN패킷보다 늦게 도착할 수 있기 때문에 TIME_WAIT상태에서 일정시간 기다리는 것이다.)

  3. Time_wait상태가 끝나면 Server는 연결을 종료하겠다는 FIN플래그를 전송한다.

  4. Client는 FIN플래그에 대한 ACK플래그를 보낸 후 tcp 연결을 종료 된다

image

 

 

'네트워크' 카테고리의 다른 글

SSL 동작과정  (0) 2020.08.19
TCP 프로토콜 - (흐름제어 와 혼잡제어)  (0) 2020.08.19
Post와 GET의 차이  (0) 2018.03.11

+ Recent posts