线程和锁定资源

提姆

我希望能对理解一个概念有所帮助。对于不正确使用术语,我深表歉意。我是OOP的新手,所以请多多包涵。

这是一些伪代码来显示问题:

public MyClass
{
    myClass singleton; //singleton object of myClass (only one instance created)
    myCollection; //list or array
    private object _lock;

    public myFunction()
    {
        lock(myCollection) //or do I use lock(_lock)?
        {
            try
            {
                //modifies my collection
            }
            catch
            {
                //exception
            }
        }
    }

    public secondFunction()
    {
        //modify my collection
    }

    public getMyCollection()
    {
        return myCollection;
    }

}

现在,我们假设有两个对象分别位于与classA和classB不同的线程上(我将这些对象称为objA和objB),它们正在尝试访问MyClass。

1)如果objA使用myFunction,我知道由于锁定,objB将无法同时使用myFunction。

但是,objB可以使用secondFunction()吗?还是myFunction()上的锁保护myCollection在锁释放之前不被修改?

如果上述问题是正确的:如果objA使用myFunction(),而objB尝试使用secondFunction(),那么objB线程会一直等到释放锁吗?

2)什么是更好的约定?锁(_lock)或锁(myCollection)

3)如果我在myfunction()中使用lock(_lock),它仍然可以保护myCollection使其不会在secondFunction()中被访问吗?

感谢您的时间和耐心等待。

埃里克·利珀特

如果objA使用myFunction,我知道由于锁定,objB将无法同时使用myFunction。

要清楚:objA和objB是“在线程A上调用”和“在线程B上调用”的简写。

您的陈述基本上是正确的;我们可以更清晰地说,如果线程A获取了锁,那么线程B尝试获取锁的尝试将一直阻塞,直到线程A释放锁为止。

另请注意,不能保证锁是公平的。如果线程C尝试在线程B之后获取该锁,则无法保证线程A在释放它时会获得线程B。线程C可以先执行。

这样想吧。你有沙漠。沙漠中间是一个浴缸。没有墙。浴缸旁边有一扇门。门有锁。规则是:如果要使用浴缸且门未锁,请锁门,洗个澡,然后将门解锁。如果要使用浴缸且门已锁,请等待直到将其解锁。如果有多个人在等,那么将通过某种未指定的机制选择一个人赢得对浴缸的比赛。

但是,objB可以使用secondFunction()吗?

当然。无论门是否锁好,这都将违反规则并跳进浴缸。记住,没有墙。

还是myFunction()上的锁保护myCollection在锁释放之前不被修改?

一点也不。除了将相同的锁放在可以修改的每个位置上之外,什么都不会阻止myCollection的修改也就是说,如果每个人都想使用浴缸,则要求每个人都在门口等。

如果objA使用myFunction(),而objB尝试使用secondFunction(),那么objB线程会一直等到释放锁时吗?

没有; secondFunction没有锁。

再次,回到基础。锁可以由线程获取,而锁可以获取它的线程释放一个锁可以被同一线程多次获取而无需释放它。一旦所有获取都具有相应的释放,则任何其他线程均可自由获取该锁。

就您的目的而言,就是这样锁非常非常简单。您可以获取它们,如果无法获取,则会阻塞,直到可以获取为止。获取锁后,您需要在其他人转身之后不久将其释放。

使用锁的方法要复杂得多,但要从基础开始。

有什么更好的约定?锁(_lock)或锁(myCollection)

始终锁定专用的专用对象,该对象仅用于lock如果您偏离最佳做法,有很多方法可能会导致严重错误。

特别是永远不要锁定a Type,astring或on this

如果我在myfunction()中使用lock(_lock),它将仍然保护myCollection免受在secondFunction()中访问吗?

否。再次,返回锁的定义。lock语句尝试获取lock就是它全部功能。如果您在其他地方有一些其他功能在需要时不获取锁,那是一个错误。如果听起来像是容易编写的错误,那就是

多线程非常困难,如果不小心,很容易同时导致很多人陷入困境这听起来并不像听起来那样有趣,因为他们都没有就是否应该流水达成一致意见,也许其中有些人试图在浴缸里有人的同时清洗浴缸,这很混乱,使您的工作流程崩溃,丢失用户的数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章