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