首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReaderWriterLockSlim与参考文献

ReaderWriterLockSlim与参考文献
EN

Stack Overflow用户
提问于 2016-10-21 23:49:45
回答 2查看 224关注 0票数 0

我有一堂课:

代码语言:javascript
复制
public static class Message
{
    private static readonly ReaderWriterLockSlim Locker = new ReaderWriterLockSlim();
    private static string theMessage;

    public static void SetMessage(string message)
    {
        Locker.EnterWriteLock();
        theMessage = message;
        Locker.ExitWriteLock();
    }

    public static string GetMessage()
    {
        Locker.EnterReadLock();
        var msg = theMessage; // <<<=====
        Locker.ExitReadLock();
        return msg;
    }
}

如果我正确理解,在指定的行中,我将创建一个对theMessage的引用,然后返回它。多线程会访问相同的变量,还是我错了?

我是否需要调用string.Copy来确保线程安全?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-21 23:57:53

由于字符串是一种引用类型,所以在这一行中将获得对值的引用,而不是对值本身的引用:

代码语言:javascript
复制
var msg = theMessage;

如果希望防止其他线程的更改影响大多数引用类型的方法的返回值,我建议您复制该值并返回对新复制的值的另一个引用。

但是字符串是不可变的类型,所以它并不重要,因为无论如何,其他线程不能更改它的值(没有人可以,它是不可变的!)

因此,不需要深入复制字符串以防止其他线程更改返回值。

您可以参考这些问题(12)来进一步阅读为什么不可变对象是线程安全的。

票数 2
EN

Stack Overflow用户

发布于 2016-10-21 23:54:03

基于对象的类(字符串是一个)的成员分配在C#中是原子的。根本不需要锁。

如果在这两个块中有更多的代码而不是theMessage = message;var msg = theMessage;,那么它可能是必需的,但是因为只有一个赋值才是您所做的唯一事情,所以锁定是不必要的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40186884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档