> Java > java지도 시간 > SimpleDateFormat이 스레드로부터 안전하지 않은 이유는 무엇입니까?

SimpleDateFormat이 스레드로부터 안전하지 않은 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-07 14:40:17
원래의
893명이 탐색했습니다.

Why is SimpleDateFormat Not Thread-Safe?

SimpleDateFormat이 스레드 안전 문제를 일으키는 이유는 무엇입니까?

소개

코드 예: 시연 문제

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class SimpleDateFormatExample {

    public static void main(String[] args) throws InterruptedException {
        final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        final List<String> formattedDates = new ArrayList<>();
        final ExecutorService executorService = Executors.newFixedThreadPool(10);

        for (int i = 0; i < 1000; i++) {
            executorService.submit(() -> {
                final String date = simpleDateFormat.format(new java.util.Date());
                formattedDates.add(date);
            });
        }

        executorService.shutdown();
        executorService.awaitTermination(1, TimeUnit.MINUTES);

        // Check for any duplicate formatted dates
        // This check demonstrates the potential for incorrect formatting due to thread safety issues
        for (int i = 0; i < formattedDates.size(); i++) {
            for (int j = i + 1; j < formattedDates.size(); j++) {
                if (formattedDates.get(i).equals(formattedDates.get(j))) {
                    System.out.println("Duplicate formatted date detected: " + formattedDates.get(i));
                }
            }
        }
    }
}
로그인 후 복사

문제 분석

SimpleDateFormat은 중간 결과를 인스턴스 필드에 저장하므로 여러 스레드가 동일한 인스턴스를 동시에 사용할 때 데이터 손상에 취약합니다. 코드 예제에서는 여러 스레드가 'format()' 메서드를 호출하여 인스턴스 필드의 공유 상태로 인해 시간 형식이 잘못되고 결과가 중복될 가능성이 있습니다.

FastDateFormat의 스레드 안전

FastDateFormat은 SimpleDateFormat과 달리 인스턴스 필드를 피하고 내부 달력 인스턴스에 스레드 로컬 변수를 활용하여 스레드로부터 안전한 설계를 사용합니다. 이를 통해 각 스레드에는 자체 전용 달력이 있어 충돌이나 데이터 손상의 위험이 제거됩니다.

스레드 안전성 향상을 위한 대안

FastDateFormat 외에 처리를 위한 대체 솔루션 스레드로부터 안전한 날짜 형식에는 다음이 포함됩니다.

  • 스레드 로컬 인스턴스 활용 스레드 풀 내의 SimpleDateFormat.
  • Joda-Time DateTimeFormat과 같이 스레드로부터 안전한 날짜/시간 형식을 제공하는 라이브러리를 사용합니다.

위 내용은 SimpleDateFormat이 스레드로부터 안전하지 않은 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿