"Trước khi bạn có thể viết phong nha mã đa luồng, tuy nhiên, bạn thực sự cần phải nghiên cứu thêm về sự phức tạp và tinh tế của đa luồng mã.
Khi nói đến chủ đề, rất ít được đảm bảo.
Bạn có thể tưởng tượng sự tàn phá có thể xảy ra khi hai luồng khác nhau truy cập vào một cá thể của một lớp, cả hai luồng đều gọi các phương thức trên đối tượng đó ... và các phương thức đó sửa đổi trạng thái của đối tượng? ... quá đáng sợ để thậm chí hình dung. ", từ Sun Certified Programmer cho Java 6, chương 9: Chủ đề.
Bạn tôi,
Trong Java, chủ đề không cache bất kỳ đối tượng hay thay đổi, họ chỉ có một tham chiếu đến mộtdụ của một đối tượng . Nói về bộ nhớ cache của chủ đề giống như nói về các luồng hệ thống tác vụ ... Java hoạt động theo cùng một cách trong tất cả hệ điều hành, cho dù chủ đề được quản lý nội bộ như thế nào, rất khác nhau tùy thuộc vào hệ điều hành khác nhau.
Nhìn một mã này:
AccountDanger r = new AccountDanger();
Thread one = new Thread(r):
Thread two = new Thread(r);
Như bạn có thể thấy, trong trường hợp này đề có quyền truy cập vào cùng một ví dụ: r. Sau đó, bạn sẽ gặp sự cố đồng bộ, chắc chắn ... không quan trọng nếu chúng tôi nói về thành viên gốc hoặc đối tượng, chủ đề một và hai sẽ có quyền truy cập vào tất cả các thành viên r (nếu chúng là có thể truy cập qua phạm vi hoặc người định cư/getters) và họ sẽ đọc trực tiếp các giá trị từ ví dụ r. Điều này là chắc chắn ngay cả khi bạn không nhận thấy nó, mà đôi khi thực sự khó khăn.
Tôi khuyên bạn nên đọc khoảng phạm vi java và đồng bộ hóa java, nếu bạn muốn mã hóa các ứng dụng đa luồng.
Kính trọng,
Nguồn
2013-12-12 21:14:17
Lưu ý rằng "tiếp theo" không giống với "xảy ra sau khi viết". 'volatile' không cung cấp bất kỳ sự đảm bảo * kịp thời nào *, nó chỉ là về * tính nhất quán * trong việc không bao giờ quan sát viết ra theo thứ tự. –
@pveentjer Tại sao bạn nói như - nó có thể được nhìn thấy .. nó cũng có thể không được hiển thị? Chỉ tham chiếu được lưu trong bộ đệm cục bộ luồng. Vì vậy, các thay đổi sẽ hiển thị trên các chuỗi. Liệu tôi có sai ? Thủ thuật phần cứng/trình biên dịch - Bạn có thể đưa ra một bức tranh rõ ràng hơn không. – Kiran