일상 프로 그래 밍 의 작은 기교 와 주의 점 (3)

목차
1 Simple DateFormat 은 스 레 드 가 안전 하지 않 은 클래스 입 니 다. 일반적으로 static 변수 로 정의 하지 마 십시오. static 로 정의 되면 잠 금 을 추가 하거나 DateUtils 도구 류 를 사용 해 야 합 니 다.
2. 높 은 동시 다발 장면 에서 동기 호출 은 자물쇠 의 성능 손실 을 고려 해 야 한다.잠 금 없 는 데이터 구 조 를 사용 할 수 있 으 면 잠 금 을 사용 하지 마 세 요.블록 을 잠 글 수 있 으 면 전체 방법 체 를 잠 그 지 마 세 요.대상 자 물 쇠 를 사용 할 수 있 으 면 클래스 자 물 쇠 를 사용 하지 마 세 요.
3 여러 자원, 데이터베이스 테이블, 대상 에 동시에 자 물 쇠 를 추가 할 때 일치 하 는 자 물 쇠 를 추가 하 는 순 서 를 유지 해 야 한다. 그렇지 않 으 면 자물쇠 가 사라 질 수 있다
4. 같은 기록 을 동시에 수정 할 때 업데이트 손실 을 피하 기 위해 자 물 쇠 를 추가 해 야 합 니 다.응용 층 에 자 물 쇠 를 추가 하거나 캐 시 층 에 자 물 쇠 를 추가 하거나 데이터베이스 층 에 낙관적 인 자 물 쇠 를 사용 하여 version 을 업데이트 근거 로 사용 합 니 다.
5 랜 덤 인 스 턴 스 가 다 중 스 레 드 에 사용 되 는 것 을 피 합 니 다. 이 인 스 턴 스 를 공유 하 는 것 은 안전 하지만 같은 seed 경쟁 으로 인해 성능 이 떨 어 질 수 있 습 니 다.
6 volatile 다 중 스 레 드 메모리 보이 지 않 는 문제 해결
7 HashMap 은 용량 이 부족 하여 resize 를 진행 할 때 높 은 병발 로 인해 체인 이 발생 할 수 있 기 때문에 CPU 의 점용 이 급증 할 수 있 으 며 개발 과정 에서 다른 데이터 구조 나 잠 금 을 사용 하여 이 위험 을 피 할 수 있 습 니 다.
8 높 은 동시 다발 장면 에서 '같 음' 판단 을 중단 하거나 탈퇴 하 는 조건 으로 사용 하지 않도록 한다.
9 코드 를 수정 하 는 동시에 주석 을 상응 하 게 수정 해 야 한다. 특히 매개 변수, 반환 값, 이상, 핵심 논리 등 을 수정 해 야 한다.
10 정규 표현 식 을 사용 할 때 사전 컴 파일 기능 을 잘 이용 하면 정규 일치 속 도 를 효과적으로 가속 화 할 수 있 습 니 다.
11 이상 은 프로 세 스 제어, 조건 제어 에 사용 하지 마 세 요.
12 catch 시 안정 코드 와 비 안정 코드 를 구분 하 십시오.안정 코드 는 어떻게 든 틀 리 지 않 는 코드 를 말한다.불안정 코드 의 catch 에 대해 서 는 가능 한 한 이상 유형 을 구분 한 후 대응 하 는 이상 처 리 를 합 니 다.
13 중복 되 는 코드 (Don 't Repeat Yourself), 즉 DRY 원칙 이 나타 나 지 않도록 합 니 다.
14 trace / debug / info 급 로그 출력 은 조건 출력 형식 이나 자리 표시 자 를 사용 해 야 합 니 다.
15 【 MySQL 】 개념 여 부 를 나타 내 는 필드, is 를 사용 해 야 합 니 다.xxx 방식 으로 명명 되 었 습 니 다. 데이터 형식 은 unsigned tinyint 입 니 다.
16 [MySQL] 에서 보존 자 를 사용 하지 않 습 니 다. 예 를 들 어 desc, range, match, delayed 등 은 MySQL 공식 보존 자 를 참고 하 십시오.
17 [MySQL] 메 인 키 인덱스 이름 은 pk필드 이름, 유일한 색인 이름 은 uk필드 이름, 일반 색인 이름 은 idx필드 이름
18 [MySQL] 소수 형식 은 decimal 이 며, float 와 double 을 사용 할 수 없습니다. 
19 [MySQL] 저 장 된 문자열 의 길이 가 거의 같다 면 char 를 사용 하여 긴 문자열 형식 을 정 해 야 합 니 다.
20 [MySQL] varchar 는 가 변 긴 문자열 로 저장 공간 을 미리 할당 하지 않 고 길이 가 5000 자 를 초과 하지 않 습 니 다.저장 길이 가 이 값 보다 크 면 필드 형식 을 text 로 정의 하고 표 한 장 을 독립 시 켜 주 키 로 대응 하여 다른 필드 의 색인 효율 에 영향 을 주지 않도록 해 야 합 니 다.
전에 '일상 프로 그래 밍 의 작은 기교 와 주의 점 (2)' 을 쓴 적 이 있 는데 관심 이 있 으 면 볼 수 있 습 니 다.
1 Simple DateFormat 은 스 레 드 가 안전 하지 않 은 클래스 입 니 다. 일반적으로 static 변수 로 정의 하지 마 십시오. static 로 정의 되면 잠 금 을 추가 하거나 DateUtils 도구 류 를 사용 해 야 합 니 다.
    정규: 스 레 드 안전 에 주의 하고 DateUtils 를 사용 하 십시오.아래 와 같이 처리 하 는 것 을 추천 합 니 다.
private static final ThreadLocal df = new ThreadLocal() {
​
    @Override
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd");
    }
};

    설명: JDK 8 의 응용 프로그램 이 라면 Date 대신 Instant 를 사용 할 수 있 습 니 다. LocalDateTime 은 Calendar 대신, DateTimeFormatter 는 Simple DateFormat 대신 에 공식 적 으로 설명 할 수 있 습 니 다. simple beautiful strong immutable thread - safe.
2. 높 은 동시 다발 장면 에서 동기 호출 은 자물쇠 의 성능 손실 을 고려 해 야 한다.잠 금 없 는 데이터 구 조 를 사용 할 수 있 으 면 잠 금 을 사용 하지 마 세 요.블록 을 잠 글 수 있 으 면 전체 방법 체 를 잠 그 지 마 세 요.대상 자 물 쇠 를 사용 할 수 있 으 면 클래스 자 물 쇠 를 사용 하지 마 세 요.
    설명: 잠 금 을 넣 은 코드 블록 작업량 을 가능 한 한 적 게 하고 잠 금 코드 블록 에서 RPC 방법 을 사용 하지 않도록 합 니 다.
3 여러 자원, 데이터베이스 테이블, 대상 에 동시에 자 물 쇠 를 추가 할 때 일치 하 는 자 물 쇠 를 추가 하 는 순 서 를 유지 해 야 한다. 그렇지 않 으 면 자물쇠 가 사라 질 수 있다
설명: 만약 에 스 레 드 1 이 표 A, B, C 에 대해 차례대로 자 물 쇠 를 추가 해 야 업데이트 작업 을 할 수 있다 면 스 레 드 2 의 자 물 쇠 를 추가 하 는 순서 도 A, B, C 여야 합 니 다. 그렇지 않 으 면 자물쇠 가 생 길 수 있 습 니 다.
4. 같은 기록 을 동시에 수정 할 때 업데이트 손실 을 피하 기 위해 자 물 쇠 를 추가 해 야 합 니 다.응용 층 에 자 물 쇠 를 추가 하거나 캐 시 층 에 자 물 쇠 를 추가 하거나 데이터베이스 층 에 낙관적 인 자 물 쇠 를 사용 하여 version 을 업데이트 근거 로 사용 합 니 다.
설명: 매번 방문 충돌 확률 이 20% 보다 적 으 면 낙관적 인 자 물 쇠 를 사용 하 는 것 을 추천 합 니 다. 그렇지 않 으 면 비관 적 인 자 물 쇠 를 사용 하 는 것 을 추천 합 니 다.낙관 자물쇠 의 재 시도 횟수 는 세 번 보다 작 으 면 안 된다.
5 랜 덤 인 스 턴 스 가 다 중 스 레 드 에 사용 되 는 것 을 피 합 니 다. 이 인 스 턴 스 를 공유 하 는 것 은 안전 하지만 같은 seed 경쟁 으로 인해 성능 이 떨 어 질 수 있 습 니 다.
설명: Random 실례 는 java. util. Random 의 실례 나 Math. random () 의 방식 을 포함한다.
정규: JDK 7 이후 API ThreadLocalRandom 을 직접 사용 할 수 있 으 며, JDK 7 이전에 모든 스 레 드 가 하나의 인 스 턴 스 를 가지 고 있 도록 인 코딩 이 필요 합 니 다.
6 volatile 다 중 스 레 드 메모리 보이 지 않 는 문제 해결
    한 번 쓰 고 많이 읽 으 면 변수 동기 화 문 제 를 해결 할 수 있 지만 많이 쓰 면 스 레 드 안전 문 제 를 해결 할 수 없습니다.count + + 작업 이 라면 다음 종 류 를 사용 하여 이 루어 집 니 다.
AtomicLong count = new AtomicLong();
count.addAndGet(1);

    JDK 8 이 라면 아 토 믹 롱 보다 성능 이 좋 은 롱 애 더 대상 을 추천 합 니 다 (낙관적 잠 금 재 시도 횟수 감소).롱 애 더 가 집계 할 때 동시 업데이트 가 있 으 면 통계 에 오차 가 생 길 수 있다 는 단점 이 있다.
7 HashMap 은 용량 이 부족 하여 resize 를 진행 할 때 높 은 병발 로 인해 체인 이 발생 할 수 있 기 때문에 CPU 의 점용 이 급증 할 수 있 으 며 개발 과정 에서 다른 데이터 구조 나 잠 금 을 사용 하여 이 위험 을 피 할 수 있 습 니 다.
8 높 은 동시 다발 장면 에서 '같 음' 판단 을 중단 하거나 탈퇴 하 는 조건 으로 사용 하지 않도록 한다.
설명: 병발 제어 가 잘 처리 되 지 않 으 면 등가 판단 이 '뚫 림' 되 기 쉬 우 므 로 크 거나 작은 구간 판단 조건 으로 대체 해 야 한다.
반 례: 남 은 상품 수량 이 0 이 라 고 판단 할 때 상품 지급 을 중지 하지만 동시 처리 오류 로 상품 수량 이 순식간에 마이너스 로 변 하면 이 벤트 를 종료 할 수 없습니다.
9 코드 를 수정 하 는 동시에 주석 을 상응 하 게 수정 해 야 한다. 특히 매개 변수, 반환 값, 이상, 핵심 논리 등 을 수정 해 야 한다.
    설명: 코드 와 주석 업데이트 가 일치 하지 않 습 니 다. 마치 도로망 과 네 비게 이 션 소프트웨어 의 업데이트 가 일치 하지 않 는 것 처럼 네 비게 이 션 소프트웨어 의 업데이트 가 심각하게 정체 되면 네 비게 이 션 의 의 미 를 잃 습 니 다.
10 정규 표현 식 을 사용 할 때 사전 컴 파일 기능 을 잘 이용 하면 정규 일치 속 도 를 효과적으로 가속 화 할 수 있 습 니 다.
설명: 방법 내 에서 정의 하지 마 십시오: Pattern pattern = Pattern. copile (규칙);
11 이상 은 프로 세 스 제어, 조건 제어 에 사용 하지 마 세 요.
설명: 이상 설계 의 취 지 는 프로그램 운행 중의 각종 의외 의 상황 을 해결 하 는 것 이 고 이상 한 처리 효율 은 조건 판단 방식 보다 훨씬 낮다.
12 catch 시 안정 코드 와 비 안정 코드 를 구분 하 십시오.안정 코드 는 어떻게 든 틀 리 지 않 는 코드 를 말한다.불안정 코드 의 catch 에 대해 서 는 가능 한 한 이상 유형 을 구분 한 후 대응 하 는 이상 처 리 를 합 니 다.
설명: 큰 코드 에 try - catch 를 하면 프로그램 이 서로 다른 이상 에 따라 정확 한 스트레스 반응 을 하지 못 하고 포 지 셔 닝 문제 에 도 불리 합 니 다.이것 은 무책임 한 표현 이다.
예: 사용자 가 등록 한 장면 에서 사용자 가 불법 문 자 를 입력 하거나 사용자 이름 이 존재 하거나 사용자 가 입력 한 비밀번호 가 너무 간단 하면 프로그램 에서 유형 별 판단 을 하고 사용자 에 게 알려 줍 니 다.
13 중복 되 는 코드 (Don 't Repeat Yourself), 즉 DRY 원칙 이 나타 나 지 않도록 합 니 다.
설명: 코드 를 임의로 복사 하고 붙 여 넣 으 면 코드 가 중복 되 기 때문에 나중에 수정 이 필요 할 때 모든 복사 본 을 수정 해 야 하 며 누락 되 기 쉽다.필요 할 때 공통성 방법 이나 추상 적 인 공공 류 를 추출 하거나 코드 를 구성 할 수 있다.
정규: 한 클래스 에 여러 개의 Public 방법 이 있 습 니 다. 같은 매개 변수 검사 작업 을 해 야 합 니 다. 이 럴 때 추출 하 십시오: private boolean checkParam (DTO dto) {...}
14 trace / debug / info 급 로그 출력 은 조건 출력 형식 이나 자리 표시 자 를 사용 해 야 합 니 다.
설명: logger. debug ("id 로 무역 처리:" + id + "및 기호:" + 기호);로그 단계 가 warn 이면 위 로 그 는 인쇄 되 지 않 지만 문자열 연결 작업 을 수행 합 니 다. symbol 이 대상 이 라면 toString () 방법 을 실행 하고 시스템 자원 을 낭비 하 며 위 작업 을 실 행 했 지만 로 그 는 인쇄 되 지 않 았 습 니 다.
정규: (조건)
if (LOGGER.isDebugEnabled()) {
    LOGGER.debug("Processing trade with id:" + id + " and symbol:" + symbol);
}

정규: (자리 표시 자)
LOGGER.debug("Processing trade with id:{} and symbol:{}", id, symbol);

15 【 MySQL 】 개념 여 부 를 나타 내 는 필드, is 를 사용 해 야 합 니 다.xxx 방식 으로 명명 되 었 습 니 다. 데이터 형식 은 unsigned tinyint 입 니 다.
설명: 모든 필드 가 마이너스 가 아니라면 unsigned 여야 합 니 다.
정규: 논리 삭 제 를 표현 하 는 필드 이름 isdeleted, 1 은 삭 제 를 표시 하고 0 은 삭제 되 지 않 았 음 을 표시 합 니 다.
16 [MySQL] 에서 보존 자 를 사용 하지 않 습 니 다. 예 를 들 어 desc, range, match, delayed 등 은 MySQL 공식 보존 자 를 참고 하 십시오.
    설명: pk즉, primary key;uk_즉 고유 키;idx_index 의 약칭.
17 [MySQL] 메 인 키 인덱스 이름 은 pk필드 이름, 유일한 색인 이름 은 uk필드 이름, 일반 색인 이름 은 idx필드 이름
18 [MySQL] 소수 형식 은 decimal 이 며, float 와 double 을 사용 할 수 없습니다. 
설명: 저장 할 때 float 와 double 에 정밀도 손실 문제 가 존재 하 므 로 값 을 비교 할 때 부정 확 한 결 과 를 얻 을 수 있 습 니 다.저 장 된 데이터 범위 가 decimal 의 범 위 를 초과 하면 데 이 터 를 정수 와 소수 로 분리 하여 저장 하 는 것 을 권장 합 니 다.
19 [MySQL] 저 장 된 문자열 의 길이 가 거의 같다 면 char 를 사용 하여 긴 문자열 형식 을 정 해 야 합 니 다.
20 [MySQL] varchar 는 가 변 긴 문자열 로 저장 공간 을 미리 할당 하지 않 고 길이 가 5000 자 를 초과 하지 않 습 니 다.저장 길이 가 이 값 보다 크 면 필드 형식 을 text 로 정의 하고 표 한 장 을 독립 시 켜 주 키 로 대응 하여 다른 필드 의 색인 효율 에 영향 을 주지 않도록 해 야 합 니 다.

좋은 웹페이지 즐겨찾기