Mã này là từ hiệu quả Java (khoản 66): (không đồng bộ hoặc không ổn định này không bao giờ kết thúc)Tại sao luồng hoạt động khác với thân phương pháp chạy khác nhau?
public class ThreadPractice {
static boolean canrunstatic;
public static void main(String[] args) throws InterruptedException {
Thread backgroundThread = new Thread(new Runnable() {
public void run() {
int i = 0;
while (!canrunstatic){i++;}
System.out.println("finished");
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
canrunstatic = true;
}
Như Bloch đề cập trong chương rằng nó sẽ không bao giờ viết "xong" ra cửa sổ Console. Tôi đã chơi xung quanh với lớp này và thêm dòng đó vào phương thức chạy runnable:
System.out.println("im still running");
Với vòng lặp while này không chỉ tăng i mà in ra chuỗi này trong mỗi vòng lặp. Nhưng điều khiến tôi phát điên, theo cách này, sợi chỉ dừng lại sau 1 giây, khi sợi chính quay trở lại từ giấc ngủ.
chỉnh sửa: (dừng mà không dễ bay hơi/sync)
public class ThreadPractice {
static boolean canrunstatic;
public static void main(String[] args) throws InterruptedException {
Thread backgroundThread = new Thread(new Runnable() {
public void run() {
int i = 0;
while (!canrunstatic){i++;System.out.println("im still running");}
System.out.println("finished");
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
canrunstatic = true;
}
Vì vậy, logic đằng sau này là gì?
Điều đó không được chỉ định ở bất kỳ đâu trong mô hình bộ nhớ. Việc ghi vào bàn điều khiển là một hoạt động bên ngoài trong JMM, nhưng điều này không đảm bảo việc đồng bộ hóa và các khoản phí không tạo ra một cạnh đồng bộ hóa. Vì vậy, đây không phải là một lời giải thích cho logic đằng sau này. – MinecraftShamrock
Điểm tốt, đây là nguyên nhân, nhưng không bắt buộc phải xảy ra. Tôi đã cập nhật câu trả lời để phản ánh điều này. – Thirler