Tôi đang tạo một chương trình bằng java đua một vài chiếc xe với nhau. Mỗi chiếc xe là một sợi riêng biệt.Trình điều khiển có tăng cường an toàn cho thread?
Khi xe ô tô hoàn thành cuộc đua, mỗi xe đều gọi phương thức này. Tôi đã thử nghiệm phương pháp ở tốc độ hẹn giờ khác nhau, và nó có vẻ hoạt động tốt. Nhưng tôi nhận ra rằng mỗi thread đang truy cập vào biến carsComplete, đôi khi tại cùng một thời điểm chính xác (ít nhất là ở phạm vi ngày lệnh cho tôi).
Vì vậy, câu hỏi của tôi là: phương pháp này có an toàn không?
public static String completeRace()
{
Date accessDate = new Date();
System.out.println("Cars Complete: " + carsComplete + " Accessed at " + accessDate.toString());
switch(++carsComplete)
{
case 1: return "1st";
case 2: return "2nd";
case 3: return "3rd";
default: return carsComplete + "th";
}
}
Hoặc đồng bộ hóa thứ gì đó trước khi tăng. –
@Ted: Tôi đặt cược rằng việc đồng bộ hóa trên một cái gì đó đắt hơn. –
@Eric - Tôi sẽ ngạc nhiên nếu AtomicInteger không thực hiện một số đồng bộ hóa tại một thời điểm nào đó (có thể trong mã gốc). Nó sẽ là thú vị để chuẩn. Từ nguồn cho AtomicInteger, nó dường như phụ thuộc vào một thuật toán so sánh và thiết lập nguyên tử mà thử lại cho đến khi nó phát hiện không có vấn đề gì. Không có trường hợp xấu nhất bị ràng buộc cho điều này; trong các kịch bản có độ chủ đề cao, tôi nghĩ nó có thể rất chậm vào những thời điểm ngẫu nhiên. –