2016-11-05 11 views
5

Đây là điều tôi chưa bao giờ hiểu. Nó gần như có vẻ giống như một hack để tạo ra một đối tượng giả mà được lock ed, giống như ví dụTại sao chúng ta cần khóa và đối tượng trong C#?

class Account 
{ 
    decimal balance; 
    private Object thisLock = new Object(); 

    public void Withdraw(decimal amount) 
    { 
     lock (thisLock) 
     { 
      if (amount > balance) 
      { 
       throw new Exception("Insufficient funds"); 
      } 
      balance -= amount; 
     } 
    } 
} 

từ https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx.

Tại sao có thể không phải là nhà thiết kế ngôn ngữ làm cho nó để

class Account 
{ 
    decimal balance; 

    public void Withdraw(decimal amount) 
    { 
     lock 
     { 
      if (amount > balance) 
      { 
       throw new Exception("Insufficient funds"); 
      } 
      balance -= amount; 
     } 
    } 
} 

sẽ tương đương?

+5

@Sayse Không sao cả, nếu không thì sẽ không ai biết cách sử dụng 'khóa' ngay từ đầu. Những lý do tại sao cần câu lệnh 'lock' cần được thông qua một tham số khá rõ ràng, và câu hỏi là rất hợp lệ nếu tác giả không hiểu những lý do đó. – rucamzu

+0

@rucamzu - Tôi nghĩ rằng tôi đã đọc sai câu hỏi – Sayse

Trả lời

7

Ví dụ được chuyển đến lock phục vụ cho xác định phần quan trọng.

Bạn có thể có bất kỳ số phần quan trọng không liên quan nào trong mã của mình và mỗi phần sẽ khóa một đối tượng khác. Một tuyên bố số lock không tham số của lượt thích mà bạn đề xuất sẽ không thể phân biệt được giữa nhiều phần quan trọng.

EDIT

Mặc dù nó có vẻ hiển nhiên, đó là đáng chú ý là tất cả các bộ phận đơn lẻ cần phải nhập một phần quan trọng nhất định phải được tiếp cận với các đối tượng bị khóa. Vì vậy, nó không phải là vấn đề tạo ra một thể hiện tùy ý ngay trước và trong cùng phạm vi so với câu lệnh lock.

+0

Có bạn đúng, tôi đã đọc sai và tôi nghĩ rằng anh ấy không hiểu khóa đang làm gì. Cảm ơn bạn đã bình luận – mybirthname

+0

@mybirthname Không sao cả. Và chỉ để ghi lại, tôi đã tìm thấy lời giải thích của bạn rõ ràng và hữu ích. – rucamzu

0

Tôi nghĩ sự nhầm lẫn nằm ở những gì từ khóa đang hoạt động. Nó không phải là chỉ nói 1 chủ đề có thể nhập mà phần mã nhưng nó đang nói 2 điều:

  1. chỉ một thread có thể nhập phần mã này người có thisLock
  2. Bất kỳ phần khác mà bị khóa với thisLock là cũng không được phép nhập bởi bất kỳ chủ đề nào ngoại trừ chủ đề này vì chuỗi này có thisLock.

Điều bạn đang đề xuất sẽ chỉ thực hiện lần đầu tiên nhưng không phải là cả hai. Nhìn vào ví dụ này:

class Account 
{ 
    decimal balance; 
    private Object thisLock = new Object(); 
    private Object thisLock2 = new Object(); 

    public void Withdraw(decimal amount) 
    { 
     lock (thisLock) 
     { 
      if (amount > balance) 
      { 
       throw new Exception("Insufficient funds"); 
      } 
      balance -= amount; 
     } 

     // more code here but no locking necessary... 

     lock(thisLock) 
     { 
      // only one thread can enter here who has thisLock 
     } 

     lock (thisLock2) 
     { 
      // If T1 (thread1) is working with thisLock, T2 can come here since it has nothing to do 
      // with thisLock. 
     } 
    } 

    public void AnotherOperation() 
    { 
     lock (thisLock) 
     { 
      // code here... 
     } 
    } 

    public void YetAnotherOperation() 
    { 
     lock (thisLock) 
     { 
      // code here... 
     } 
    } 
} 

Khi một chủ đề, nói T1, đang làm phần rút với khóa đầu tiên, tất cả các phần khác của lớp với khóa (thisLock) không được phép nhập bởi bất kỳ thread khác cũng . Tuy nhiên, phần với thisLock2 được phép nhập vào bởi các luồng khác.

Cách tốt nhất để nghĩ về từ khóa khóa, ít nhất nó đã giúp tôi khi tôi học là nghĩ về nó như một con tin. Nói cách khác, khi một số phần nhất định của mã đang được thực thi, nó cần lấy một con tin (thisLock) trong ví dụ của bạn. Vì vậy, một khi thatLock này được lấy làm con tin, không có chủ đề nào khác có thể lấy nó làm con tin cho đến khi luồng đó giải phóng con tin. Do đó, tất cả các phần mã khác cũng cần cùng một con tin, sẽ không có sẵn.

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