lock (tân ngữ ()) - Cargo sùng bái hay một “trường hợp đặc biệt ngôn ngữ” điên rồ nào đó?


87

Tôi đang xem lại một số đoạn mã được viết bởi một chuyên gia tư vấn và trong khi hàng chục lá cờ đỏ đã xuất hiện, tôi không thể hiểu đoạn mã sau:

private void foo()
{
    if (InvokeRequired)
    {
        lock (new object())
        {
            if (m_bar!= null)
                Invoke(new fooDelegate(foo), new object[] { });
        }
    }
    else
    {
        if(OnBazChanged != null)
            OnBazChanged();
    }
}

Khóa (đối tượng mới ()) đang làm gì ở đây? Sẽ không có tác dụng gì vì nó luôn khóa trên một đối tượng khác, nhưng kiểu khóa này tồn tại liên tục trong suốt mã, ngay cả trong các phần không sao chép và dán. Đây có phải là một trường hợp đặc biệt nào đó trong ngôn ngữ C # được biên dịch cho một thứ gì đó mà tôi không biết về nó hay đơn giản là lập trình viên đã áp dụng một số hàng hóa sùng bái đã xảy ra cách đây một thời gian?


19
Tôi nghĩ họ đang rất bối rối. Họ có thể đã thấy nó ở nơi new object()lưu trữ trong một trường và trường đó được sử dụng trong các lock()câu lệnh, và họ không biết tốt hơn là không nội dòng nó.
Damien_The_Unbeliever

21
"Nhà tư vấn" đó có một số giải thích để làm ... bạn không sai: lockmã đó hoàn toàn vô dụng
Marc Gravell

12
@Baboon: Chỉ khi bạn không phải là một trong những người đã làm refactoring ...

2
Thêm vào đó, nếu đây là WinForms, thì tôi không thể hiểu tại sao phải có một khóa ở đó.
Drew Noakes

7
Hãy xóa nó, sau đó chạy lại bộ kiểm tra độ phủ mã 100% của bạn. Cái gì vậy? Các nhà tư vấn trước đó đã không làm cho một?
Spacedman,

Câu trả lời:


82

Tôi sẽ không ngạc nhiên nếu đó là một người nhìn thấy điều này:

private readonly object lockObj = new object();

private void MyMethod()
{
    lock(lockObj)
    {
        // do amazing stuff, so amazing it can only run once at a time
        // e.g. comands on the Mars Rover, or programs on iOS pre 4 / 5 ??
    }
}

và nghĩ rằng anh ta có thể cắt giảm số dòng.

Tôi sẽ rất lo lắng nếu đó là trường hợp mặc dù ...


4
Anh ấy có thể thấy một phương thức có tên là "newObject ()" và phương thức này trả về một cá thể singleton, nhưng anh ấy nói "hey, c # có từ khóa cho điều đó không"?
Amiram Korach

9
Nó thực sự nghe giống như một công việc tái cấu trúc mà không hiểu hiệu quả những gì đang diễn ra.
Aphelion,

1
@OrangeDog: Đáng buồn thay, điều đó là không thể, vì mã liên quan được viết trước khi tôi gia nhập công ty. Bây giờ có những thay đổi cần thực hiện, có lẽ tôi có thể thuyết phục Ban quản lý cho phép tôi sửa mã. Nếu không tôi sẽ không chịu trách nhiệm về bất kỳ mất ổn định (người cuối cùng để liên lạc bất cứ điều gì là ai để đổ lỗi) ...

2
@Ibruder Mức độ ưu tiên cao hơn sẽ là thuyết phục Ban quản lý rằng họ cần hệ thống kiểm soát phiên bản, kiểm tra và đánh giá tự động. Nếu người cuối cùng chạm vào bất cứ điều gì là người đáng trách, thì đó không phải là một công ty rất tốt để làm việc.
OrangeDog

1
Tôi không quan tâm nhiều về các khóa rõ ràng là bị phá vỡ - những người khác đã chỉ ra, nhưng 1 chỉ dành riêng cho cho 'hoặc các chương trình trên iOS trước 4/5' <g>
Martin James

15

Đây là câu hỏi tương tự và câu trả lời:

Các khóa đảm bảo loại trừ lẫn nhau - không nhiều hơn một luồng có thể giữ khóa cùng một lúc. Khóa được xác định với một cá thể đối tượng cụ thể. Bạn đang tạo một đối tượng mới để khóa vào mọi lúc và bạn không có cách nào để thông báo cho bất kỳ luồng nào khác khóa trên cá thể đối tượng chính xác đó. Do đó, khóa của bạn là vô dụng.


2

Nó có lẽ là vô ích. Nhưng có khả năng là nó tạo ra một rào cản trí nhớ. Không chắc liệu c # có khóa elision hay không hoặc liệu nó có bảo tồn ngữ nghĩa thứ tự của khóa hay không.


Đó là một vài năm trước nhưng anh bạn, bạn hoàn toàn xứng đáng được +1 vì đã nêu ra sự thật hiển nhiên mà một số người hoàn toàn phớt lờ. Ví dụ, trên Universal Windows Platform không có phương thức MemoryBarrier () và phép thuật với Interlocked.CompareExchange và khóa (đối tượng mới ()) trở thành cách duy nhất để giải quyết một số vấn đề.
Sergey.quixoticaxis.Ivanov

Tôi thậm chí không biết C # cho phép điều này. Tuyệt vời của bạn để chỉ ra nó.
Mọi người
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.