2011-12-07 40 views

Trả lời

18

Việc chặn có thể hoặc không thể giống như đồng bộ, tùy thuộc vào ngữ cảnh. Khi chúng ta nói về các cuộc gọi phương thức, sau đó một cuộc gọi đồng bộ cũng có thể được gọi là chặn (tôi sẽ quay lại điều này một chút), bởi vì thread gọi phương thức không thể tiếp tục cho đến khi phương thức trả về. Từ trái nghĩa trong trường hợp này sẽ không đồng bộ.

Trong thuật ngữ khóa, khóa được cho là đang chặn nếu chuỗi chờ để lấy nó được đặt ở chế độ bị treo cho đến khi khóa khả dụng (hoặc cho đến khi hết thời gian chờ). Từ trái nghĩa trong trường hợp này là khóa không chặn, nghĩa là chuỗi trả về ngay lập tức ngay cả khi nó không thể lấy khóa. Điều này có thể được sử dụng để thực hiện cái gọi là khóa quay, nơi bạn tiếp tục bỏ phiếu trạng thái khóa trong khi giữ cho luồng hoạt động.

Có nói điều này, bạn có thể ngoại suy sự khác biệt giữa các khái niệm: đồng bộ nói chung có nghĩa là một hoạt động phải chờ trả lời trước khi chuỗi có thể di chuyển về phía trước. Blocking đề cập đến thực tế là thread được đặt trong trạng thái chờ (thường có nghĩa là nó sẽ không được lên lịch thực hiện cho đến khi xảy ra một số sự kiện). Từ đây, bạn có thể kết luận rằng cuộc gọi đồng bộ có thể liên quan đến hành vi chặn hoặc có thể không phụ thuộc vào việc triển khai bên dưới (tức là nó cũng có thể quay, nghĩa là bạn đang mô phỏng hành vi đồng bộ với các cuộc gọi không đồng bộ).

+1

Xin chào, bạn có thể đưa ra ví dụ trong đó cuộc gọi chặn không đồng bộ không? Cảm ơn –

+0

@Always_Beginner: Cuộc gọi chặn theo định nghĩa sẽ luôn đồng bộ vì nó ngụ ý rằng luồng điều khiển chặn trong khi chờ đợi thứ gì đó hoàn thành. Tuy nhiên, cuộc gọi đồng bộ có thể không bị chặn. – Tudor

2

đồng bộ nghĩa là công việc được thực hiện trong chuỗi gọi hàm và phương thức không trả lại cho đến khi hoàn thành.

phương pháp không đồng bộ trả về ngay lập tức vì một chuỗi khác thực hiện công việc và tăng cờ hoặc kích hoạt sự kiện khi công việc được thực hiện.

chặn nghĩa là chuỗi thực thi sự kiện chặn sẽ đợi cho đến khi sự kiện diễn ra. ví dụ bạn cố gắng đọc từ một ổ cắm và không ai gửi cho bạn một tin nhắn. cuộc gọi chặn sẽ không trở lại cho đến khi tin nhắn được hồi sinh từ ổ cắm.

tốt và không chặn có nghĩa là đối diện để chặn với ngụ ý rằng các cuộc gọi không chặn là không đồng bộ.

+0

thx kronos . có vẻ như việc đồng bộ và chặn không có sự khác biệt, cả hai đều cần đợi một công việc hoặc sự kiện được thực hiện, sau đó họ có thể tiếp tục thực hiện công việc hoặc sự kiện tiếp theo. Có đúng không? – diligent

2

tôi sẽ phân loại chúng như sau:

Chặn - Chủ đề sẽ chờ vào hành động thành công cho đến khi hay thất bại (đánh dấu vào 'sẽ chờ đợi', thất bại là phổ biến một thời gian chờ)

Synchronous - Chủ đề sẽ hoàn thành hành động, hoặc bằng cách thành công hay thất bại, trước khi đến bất kỳ dòng sau nó (đánh dấu trên các dữ liệu hành động)

Non-blocking - chủ đề sẽ không chờ đợi để hoàn thành hành động, thực hiện hành động ngay lập tức

Asynchr onous - Một luồng khác (logic hoặc vật lý) sẽ hoàn thành hành động hoặc thông báo cho nó đã sẵn sàng bằng cách sử dụng một cuộc gọi lại, sẽ không đợi trước khi thực hiện các lệnh sau. Lưu ý: từ đây tên bắt nguồn không đồng bộ, vì bạn không thể chắc chắn thứ tự các lệnh sẽ thực thi

0

Chặn - hoạt động được cho là có hành vi chặn nếu đợi một số sự kiện hoàn tất. Ví dụ: nếu khóa không khả dụng, luồng có thể nhập trạng thái đợi cho sự kiện cho đến khi khóa khả dụng. Một hoạt động như vậy được cho là bị chặn.

Đồng bộ - Cuộc gọi đồng bộ có thể dễ dàng được hiểu với ví dụ về giao thức http mà khách hàng chờ trả lời từ máy chủ sau đó tiến hành. Cuộc gọi đồng bộ có thể chặn hoặc không chặn.

Không đồng bộ - Một phương pháp có thể gọi không đồng bộ phương pháp khác. Sau một cuộc gọi, nó có thể tiếp tục thực hiện lệnh tiếp theo của nó. Khi được gọi là phương thức hoàn thành nó thực hiện nó sẽ gửi một trả lời/gọi lại để gọi phương pháp của nó thành công hay thất bại.

Không chặn - Hành vi không chặn giống như kiểm tra điều kiện tại trường hợp đó. Ví dụ - trong trường hợp ổ khóa nếu nó không có sẵn, nó sẽ không đợi cho đến khi nó có sẵn như hoạt động chặn. Ngoài ra chúng ta cần phải liên tục kiểm tra sự sẵn có của ổ khóa vì sẽ không có gọi lại như cuộc gọi không đồng bộ.

Tóm tắt: Chặn luôn đồng bộ.

Cuộc gọi đồng bộ có các hoạt động chặn nếu chờ một số sự kiện hoàn tất, phương thức người gọi có thể vào trạng thái chờ.

Cuộc gọi đồng bộ không bị chặn, nếu nó liên tục kiểm tra một số sự kiện xảy ra trước khi tiếp tục lệnh tiếp theo. Phương thức người gọi không nhập trạng thái chờ trên một số sự kiện để hoàn thành.

Không thể chặn cuộc gọi không đồng bộ và liên quan đến gọi lại từ phương thức được gọi cần xử lý.

Các vấn đề liên quan