在C#中锁定非平凡对象的用例

时间:2018-02-15 03:29:21

标签: c# multithreading concurrency locking

在C#中,在调用lock()之前,通常首先创建一个专用对象,该对象仅用于锁定目的。让我们将这样的用例称为锁定一个普通的对象。

但是这种语言允许锁定非平凡的物体,尽管它通常被认为是不好的做法,并建议避免使用。

语言的设计方式使您可以编写

等代码
var someObservable = Observable.from([1, 2, 3, 4, 5]);
var someOtherObservable = Observable.from([6, 7, 8, 9]);

var first = someObservable.take(1);
var second = Observable.create((observer) => {
  return first.subscribe(
    function onNext(value) {
      /* do something with value like: */
      observer.next(value);
    },
    function onError(error) {
      observer.error(error);
    },
    function onComplete() {
      someOtherObservable.take(1).subscribe(
        function onNext(value) {
          observer.next(value);
        },
        function onError(error) {
          observer.error(error);
        },
        function onComplete() {
          observer.complete();
        }
      );
    }
  );
}).subscribe(
  function onNext(value) {
    console.log(value);
  },
  function onError(error) {
    console.error(error);
  },
  function onComplete() {
    console.log("Done!");
  }
);

然后为了最佳实践而随处携带上述提示。为什么不首先通过引入可锁定的类/接口禁止这种用法(在这种情况下,你只能将lock()应用于可锁定的对象)?

我能想到的唯一合理的解释是,在某些情况下(罕见但很重要),锁定一个非常重要的对象实际上会使困难事情变得更容易。如果是这样,有人可以举个例子吗?

0 个答案:

没有答案