CodeGym/Khóa học Java/Mô-đun 3/Thư viện đồng thời Java

Thư viện đồng thời Java

Có sẵn

Đa luồng trong Java

Máy ảo Java hỗ trợ tính toán song song . Tất cả các tính toán có thể được thực hiện trong ngữ cảnh của một hoặc nhiều luồng. Chúng ta có thể dễ dàng thiết lập quyền truy cập vào cùng một tài nguyên hoặc đối tượng cho nhiều luồng, cũng như thiết lập một luồng để thực thi một khối mã.

Bất kỳ nhà phát triển nào cũng cần đồng bộ hóa công việc với các luồng trong hoạt động đọc và ghi đối với các tài nguyên có nhiều luồng được phân bổ cho chúng.

Điều quan trọng là tại thời điểm truy cập tài nguyên, bạn có dữ liệu cập nhật để luồng khác có thể thay đổi dữ liệu đó và bạn nhận được thông tin cập nhật nhất. Ngay cả khi chúng tôi lấy ví dụ về tài khoản ngân hàng, bạn không thể sử dụng nó cho đến khi tiền đến tay bạn, vì vậy điều quan trọng là phải luôn có dữ liệu cập nhật. Java có các lớp đặc biệt để đồng bộ hóa và quản lý các luồng.

Đối tượng chủ đề

Tất cả bắt đầu với luồng chính (main), nghĩa là ít nhất chương trình của bạn đã có một luồng đang chạy. Chủ đề chính có thể tạo các chủ đề khác bằng cách sử dụng Callable hoặc Runnable . Việc tạo chỉ khác ở kết quả trả về, Runnable không trả về kết quả và không thể ném ngoại lệ đã kiểm tra. Do đó, bạn có cơ hội tốt để xây dựng công việc hiệu quả với các tệp, nhưng điều này rất nguy hiểm và bạn cần cẩn thận.

Cũng có thể lên lịch thực thi luồng trên một lõi CPU riêng biệt. Hệ thống có thể dễ dàng di chuyển giữa các luồng và thực thi một luồng cụ thể với cài đặt phù hợp: nghĩa là luồng đọc dữ liệu được thực thi trước, ngay khi chúng tôi có dữ liệu, sau đó chúng tôi chuyển nó đến luồng chịu trách nhiệm xác thực, sau đó, chúng tôi chuyển nó đến luồng để thực thi một số logic nghiệp vụ rồi một luồng mới ghi lại chúng. Trong tình huống như vậy, 4 luồng sẽ lần lượt xử lý dữ liệu và mọi thứ sẽ hoạt động nhanh hơn một luồng. Mỗi luồng như vậy được chuyển đổi thành luồng hệ điều hành gốc, nhưng nó sẽ được chuyển đổi như thế nào tùy thuộc vào việc triển khai JVM.

Lớp Thread được sử dụng để tạo và làm việc với các luồng. Nó có các cơ chế điều khiển tiêu chuẩn, cũng như các cơ chế trừu tượng, chẳng hạn như các lớp và bộ sưu tập từ java.util.concurrent .

Đồng bộ hóa luồng trong Java

Giao tiếp được cung cấp bằng cách chia sẻ quyền truy cập vào các đối tượng. Cách này rất hiệu quả nhưng đồng thời cũng rất dễ mắc sai lầm khi làm việc. Lỗi xảy ra trong hai trường hợp: nhiễu luồng - khi một luồng khác can thiệp vào luồng của bạn và lỗi nhất quán bộ nhớ - nhất quán bộ nhớ. Để giải quyết và ngăn chặn các lỗi này, chúng tôi có các phương pháp đồng bộ hóa khác nhau.

Đồng bộ hóa luồng trong Java được xử lý bởi màn hình, đây là cơ chế cấp cao cho phép chỉ một luồng thực thi một khối mã được bảo vệ bởi cùng một màn hình tại một thời điểm. Hành vi của màn hình được xem xét dưới dạng khóa; một màn hình - một khóa.

Đồng bộ hóa có một số điểm quan trọng mà bạn cần chú ý. Điểm đầu tiên là loại trừ lẫn nhau - chỉ một luồng có thể sở hữu màn hình, do đó, đồng bộ hóa trên màn hình ngụ ý rằng một khi một luồng đi vào khối đồng bộ được bảo vệ bởi màn hình, thì không luồng nào khác có thể vào khối được bảo vệ bởi màn hình. luồng đầu tiên thoát khỏi khối được đồng bộ hóa. Nghĩa là, nhiều luồng không thể truy cập cùng một khối được đồng bộ hóa cùng một lúc.

Nhưng đồng bộ hóa không chỉ loại trừ lẫn nhau. Đồng bộ hóa đảm bảo rằng dữ liệu được ghi vào bộ nhớ trước hoặc trong một khối được đồng bộ hóa sẽ hiển thị với các luồng khác được đồng bộ hóa trên cùng một màn hình. Sau khi thoát khỏi khối, chúng tôi giải phóng màn hình và một luồng khác có thể lấy nó và bắt đầu thực thi khối mã này.

Khi một luồng mới chụp màn hình, chúng tôi có quyền truy cập và khả năng thực thi khối mã đó và tại thời điểm đó, các biến sẽ được tải từ bộ nhớ chính. Sau đó, chúng ta có thể thấy tất cả các mục được hiển thị bởi bản phát hành trước đó của màn hình.

Đọc-ghi trên một trường là một hoạt động nguyên tử nếu trường được khai báo là không ổn định hoặc được bảo vệ bởi một khóa duy nhất có được trước bất kỳ thao tác đọc-ghi nào. Nhưng nếu bạn vẫn gặp lỗi, thì bạn gặp lỗi về sắp xếp lại (thay đổi thứ tự, sắp xếp lại). Nó tự biểu hiện trong các chương trình đa luồng được đồng bộ hóa không chính xác, trong đó một luồng có thể quan sát các hiệu ứng do các luồng khác tạo ra.

Hiệu quả của việc loại trừ lẫn nhau và đồng bộ hóa các luồng, nghĩa là, hoạt động chính xác của chúng chỉ đạt được bằng cách nhập một khối hoặc phương thức được đồng bộ hóa để có được một khóa hoàn toàn hoặc bằng cách lấy một khóa một cách rõ ràng. Chúng ta sẽ nói về nó dưới đây. Cả hai cách làm việc đều ảnh hưởng đến trí nhớ của bạn và điều quan trọng là đừng quên làm việc với các biến không ổn định .

Các trường dễ bay hơi trong Java

Nếu một biến được đánh dấu dễ bay hơi , thì biến đó có sẵn trên toàn cầu. Điều này có nghĩa là nếu một luồng truy cập một biến dễ bay hơi , nó sẽ nhận giá trị của nó trước khi sử dụng giá trị từ bộ đệm.

Ghi hoạt động giống như phát hành màn hình và đọc hoạt động giống như chụp màn hình. Truy cập được thực hiện trong một mối quan hệ thuộc loại "được thực hiện trước". Nếu bạn hình dung ra, tất cả những gì sẽ hiển thị với luồng A khi nó truy cập một biến dễ bay hơi là biến của luồng B. Nghĩa là, bạn được đảm bảo không bị mất các thay đổi của mình từ các luồng khác.

Các biến dễ bay hơi là nguyên tử, nghĩa là khi đọc một biến như vậy, hiệu ứng tương tự được sử dụng như khi lấy khóa - dữ liệu trong bộ nhớ được khai báo là không hợp lệ hoặc không chính xác và giá trị của biến dễ bay hơi được đọc lại từ bộ nhớ . Khi ghi, hiệu ứng trên bộ nhớ được sử dụng, cũng như khi nhả khóa - một trường dễ bay hơi được ghi vào bộ nhớ.

Đồng thời Java

Nếu bạn muốn tạo một ứng dụng siêu hiệu quả và đa luồng, bạn phải sử dụng các lớp từ thư viện JavaConcurrent nằm trong gói java.util.concurrent .

Thư viện rất đồ sộ và có nhiều chức năng khác nhau, vì vậy hãy xem những gì bên trong và chia nó thành một số mô-đun:

Đồng thời Java

Bộ sưu tập đồng thời là một tập hợp các bộ sưu tập để làm việc trong môi trường đa luồng. Thay vì trình bao bọc cơ bản Collections.synchronizedList với chức năng chặn quyền truy cập vào toàn bộ bộ sưu tập, các khóa được sử dụng trên các phân đoạn dữ liệu hoặc thuật toán không chờ đợi được sử dụng để đọc dữ liệu song song.

Hàng đợi - hàng đợi không chặn và chặn để làm việc trong môi trường đa luồng. Hàng đợi không chặn tập trung vào tốc độ và hoạt động mà không chặn luồng. Chặn hàng đợi phù hợp cho công việc khi bạn cần “làm chậm” các luồng của Nhà sản xuất hoặc Người tiêu dùng . Ví dụ: trong trường hợp một số điều kiện không được đáp ứng, hàng đợi trống hoặc đầy hoặc không có Người tiêu dùng miễn phí 'a.

Bộ đồng bộ hóa là các tiện ích tiện ích để đồng bộ hóa các luồng. Chúng là một vũ khí mạnh mẽ trong tính toán "song song".

Executor là một khung để tạo nhóm luồng thuận tiện và dễ dàng hơn, dễ dàng thiết lập lịch trình cho các tác vụ không đồng bộ với kết quả thu được.

Khóa có nhiều cơ chế đồng bộ hóa luồng linh hoạt so với cơ chế đồng bộ hóa cơ bản , chờ đợi , thông báo , thông báo Tất cả .

Nguyên tử là các lớp có thể hỗ trợ các hoạt động nguyên tử trên các nguyên hàm và tham chiếu.

Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào