[그림 1 - 1]


[그림1-1]과 같은 코드에서 testchar(1)+double(8)+int(4) 13으로 알고 있을 것이다.

하지만 실제 코드를 쳐 보면 예상하던 사이즈와 다른 것을 알수 있다.

 

이것은 내가 현재 쓰고 있는 64비트 컴퓨터에서 64비트 컴파일러를 사용하여 8바이트 데이터를 처리하는 것에 가장 최적화되어 있고 이러한 이유로 데이터를 저장하기 위한 공간을 8바이트씩 할당 받기 때문이다.

 

위에 코드를 예를 들면

 

char형을 저장하기 위해 8바이트를 할당받고 char형을 저장한다. 그러면 7바이트가 남는데 그 남은 공간에 double(8)를 저장할 수 없어 7바이트를 빈공간으로 남겨두고 바로 8바이트를 다시 할당하는 것이다.


char 

2

 double

 

 

 

 

 

 

 




이러한 공간낭비를 줄이기 위해서는 1) 8바이트로 저장될 것을 고려하여 저장하는 방법2) 특별한 전처리어를 사용하면 된다.

 

1) 먼저 8바이트가 저장될 것을 고려하여 저장하여 보자.

 

8바이트가 저장될 것을 고려하여 저장할 경우 구조체의 멤버 변수 선언의 순서가 중요하다

 

순서는 다음과 같이 바꿀수 있다.

double         double

int     or     char

char           int



double 

 

 

 

 

 

 

 

 int

 

 

 

 char

 

 

 




[그림 1 - 2]


2) #pragma pack() 전처리어 사용


[그림 1 - 3]


pragma pack(1)에서 1 1바이트 단위로 저장하겠다는 것이다.

 

, CPU64비트이기 때문에 가장 빠르게 읽을 수 있는 데이터의 단위는 8바이트이다.

그렇기 때문에 저장할 때 1이라고 선언하고 나중에 원래대로 8바이트 단위로 바꾸지 않는 다면 속도저하의 문제가 발생할 수 있다.




출처:http://javawoo.tistory.com/30

먼저 collections.synchronized___이란...


컬렉션(List, Set, Map 등등)을 싱글 스레드 환경에서 사용하다 멀티 스레드 환경으로 전달할 때 컬렉션을 동기화(synchronized) 된 컬렉션으로 리턴해주는 메소드


->한마디로 여러개의 스레드가 하나의 컬렉션에 접근할 때 생기는 오류를 동기화시킴으로써 해결해주는 메소드이다.



리턴 타입

  메소드(매개 변수) 

 설명

 List<T>

 synchronizedList(List<T> list) 

 List를 동기화된 List로 리턴

 Map<K,V>

 synchronizedMap(Map<K,V> map)

 Map을 동기화된 Map으로 리턴

 Set<T> 

 synchronizedSet(Set<T> s)

  Set을 동기화된 Set으로 리턴



 

여기서 synchronizedMap은 Map 컬렉션이 멀티 스레드에 안정되게 하기 위한 메소드이다. 

하지만, 위와 같이 동기화를 시켰을 때 하나의 스레드가 전체 컬렉션의 모든 자원 잠금시키기 때문에 전체적으로 빠르게 처리하지는 못한다.  이런 현상을 해결하기 위해 나온 것이 바로 ConcurrentHashMap 이다.


ConcurrentHashMap 은 멀티 스레드에도 마찬가지로 안전하면서도 부분 잠금을 사용하기 때문에 멀티 스레드가 요소를 병렬적으로 처리할 수 있다. , 이용하려는 자원만 잠금하고 나머진 다른 스레드가 접근할 수 있도록 하는 것이다.

'Programming > JAVA' 카테고리의 다른 글

자바 암호화시키기  (1) 2018.01.12
[자바]학점 변환기 파일  (0) 2018.01.04
자바 웹 크롤러 예제  (0) 2017.10.27
자바 설치하기(리눅스)  (1) 2017.08.23
MS-SQL(데이터베이스) 연동하기  (0) 2017.07.07
ConcurrentHashMap vs collections.synchronizedMap  (1) 2017.05.17
  1. binny 2017.05.18 19:05

    ㅎㅅㅎ 좋은정보 감사합니당

+ Recent posts