Chia sẻ tài nguyên, xung đột, chia sẻ quyền truy cập - 1

"Xin chào, Amigo! Tôi muốn nói với bạn về việc chia sẻ tài nguyên. Đương nhiên là trên các chủ đề khác nhau.

"Tôi tiếp tục nói về các vấn đề xảy ra khi làm việc với nhiều luồng và cách giải quyết chúng. Điều này không có nghĩa là sử dụng luồng là xấu. Các luồng là một công cụ rất mạnh. Thực tế, chúng cho phép bạn làm cho chương trình của mình nhanh hơn và đồng đều hơn đáng tin cậy hơn. Chương trình càng phức tạp thì càng có nhiều luồng và nhiều phần độc lập khác nhau."

"Chia một chương trình thành các phần độc lập (liên kết lỏng lẻo) là rất có lợi."

"Hãy tưởng tượng rằng chương trình của bạn được chia thành 100 luồng bên trong. Nhưng bạn chỉ có một bộ xử lý lõi kép. Điều này có nghĩa là trung bình 50 luồng sẽ được thực thi trên mỗi lõi."

"Nếu bạn cần tăng hiệu suất của chương trình, bạn chỉ cần mua một máy chủ bộ xử lý kép và một vài bộ xử lý ngọt ngào cho nó. Điều này có thể giúp bạn có tới 32 lõi, mang lại hiệu suất tăng gấp 2-20 lần. Tùy thuộc vào số lượng của các phần thực sự độc lập mà nó được chia thành."

"Đây là một trong những lý do tại sao Java chiếm ưu thế trong lĩnh vực phát triển doanh nghiệp. Nếu một công ty có một chương trình nội bộ phức tạp được viết bởi 20 nhà phát triển, thì việc mua một máy chủ khác sẽ rẻ hơn nhiều so với việc tăng gấp đôi hiệu suất của chương trình thông qua tối ưu hóa."

"Vì vậy, đó là tất cả những gì về."

"Nhưng! Mỗi khi một nhà phát triển quyết định sử dụng một luồng khác, anh ta sẽ giải quyết một vấn đề và tạo ra hai vấn đề. Càng nhiều luồng sẽ không làm tăng hiệu suất của chương trình một cách vô tận."

"Thứ nhất, bất kỳ chương trình nào cũng có công việc không thể tách rời và chạy song song trên các luồng khác nhau. Thứ hai, tất cả các luồng đều được thực thi trên cùng một bộ xử lý. Bạn càng có nhiều luồng, mỗi luồng hoạt động càng chậm."

"Và, quan trọng nhất, các luồng thường sử dụng cùng một đối tượng (thường được gọi là 'tài nguyên dùng chung')."

"Ví dụ: một luồng muốn lưu thông tin về công việc mà nó đã hoàn thành trong một tệp. Nếu có một số luồng như vậy và chúng muốn ghi thông tin vào cùng một tệp, chúng sẽ can thiệp lẫn nhau. Để ngăn tệp trở thành một lộn xộn, quyền truy cập vào tệp bị hạn chế, tức là trong khi một luồng sử dụng tệp, các luồng khác sẽ đợi."

"Vâng, tôi nhớ. Bạn làm điều đó bằng cách sử dụng từ khóa được đồng bộ hóa ."

"Chính xác."

"Và điều gì sẽ xảy ra nếu các luồng đang ghi vào các tệp khác nhau?"

"Về mặt hình thức, đây là những đối tượng khác nhau, nhưng có lẽ chúng nằm trên cùng một ổ cứng."

"Vì vậy, có thực sự có thể song song hóa thứ gì đó bên trong bộ xử lý không?"

"Về mặt kỹ thuật thì có, nhưng ngay khi chuỗi của bạn cần thứ gì đó ngoài dữ liệu mà nó có, thì thứ đó có thể đã bị chiếm bởi một chuỗi khác—và chuỗi của bạn sẽ phải đợi."

"Vậy thì tôi nên làm gì đây? Làm sao tôi biết mình có nên tạo nhiều chủ đề hay không?"

"Điều này được xác định trực tiếp bởi kiến ​​trúc chương trình của bạn. Mỗi dự án đều có 'kiến trúc sư' riêng, người biết tất cả 'tài nguyên' được sử dụng trong chương trình, biết những hạn chế của chúng và mức độ song song của chúng."

"Và nếu tôi không biết?"

"Có hai lựa chọn:"

a) làm việc dưới sự giám sát của người làm

b) nhận được một số cục u tự tìm ra nó

"Tôi là một người máy: Tôi không có cục u - chỉ có vết lõm."

"Vậy thì, lấy vài vết lõm đi."

"Tôi hiểu rồi. Cảm ơn. Bạn đã làm rõ một số điều mà tôi đã bắt đầu thắc mắc."