Không, miễn là bạn đang khóa trên cùng một đối tượng. Mã đệ quy thực sự đã có khóa và do đó có thể tiếp tục mà không bị cản trở.
lock(object) {...}
là viết tắt để sử dụng lớp Màn hình . Như Marc đã chỉ ra , Monitor
cho phép re-entrancy , vì vậy các nỗ lực lặp đi lặp lại để khóa đối tượng mà luồng hiện tại đã có khóa sẽ hoạt động tốt.
Nếu bạn bắt đầu khóa các đối tượng khác nhau , đó là lúc bạn phải cẩn thận. Đặc biệt chú ý đến:
- Luôn có được các khóa trên một số đối tượng nhất định trong cùng một chuỗi.
- Luôn mở khóa theo trình tự ngược lại với cách bạn có được chúng.
Nếu bạn phá vỡ một trong hai quy tắc này, bạn chắc chắn sẽ gặp phải sự cố bế tắc tại một số điểm .
Đây là một trang web tốt mô tả đồng bộ hóa luồng trong .NET: http://dotnetdebug.net/2005/07/20/monitor-class-avoiding-deadlocks/
Ngoài ra, hãy khóa càng ít đối tượng cùng lúc càng tốt. Xem xét việc áp dụng các khóa hạt thô nếu có thể. Ý tưởng là nếu bạn có thể viết mã của mình sao cho có một biểu đồ đối tượng và bạn có thể có được các khóa trên gốc của biểu đồ đối tượng đó, thì hãy làm như vậy. Điều này có nghĩa là bạn có một khóa trên đối tượng gốc đó và do đó không phải lo lắng quá nhiều về trình tự mà bạn có được / phát hành khóa.
(Một lưu ý nữa, về mặt kỹ thuật ví dụ của bạn không phải là đệ quy. Đối với nó là đệ quy, Bar()
sẽ phải gọi chính nó, thường là một phần của phép lặp.)