繁体   English   中英

是否有最佳实践来实现静态功能,该功能在同时访问时提供独特的价值

[英]Is there a best practice to implement static function that gives unique value on simultaneous access

静态函数retUnique()返回唯一值。 我的问题是,如果有很多用户在给定的时间点使用相同的功能,会发生什么? 是否有最佳实践来确保每个访问此静态函数的用户都同时获得唯一的值,并且不会遇到线程问题。

可以给我一个例子吗?

使多线程或多或少安全的静态函数没有什么特别的。 相反,您需要检查函数访问和修改的数据,并确保在并发调用时它仍然尊重该数据的完整性。

这是一个可能与您的问题有关的示例:

private static int myUniqueID = 1;
public static int GetFreshUniqueID()
{
    lock(someObject)
    {
        return myUniqueID++;
    }
}

在这种情况下,保持线程安全的关键是将函数锁定在某些同步上下文中,这样我们就不会遇到两个线程在每个线程都获得递增之前获得相同ID的情况。 您的情况可能会有所不同。

这不是一个简单的同步问题吗?

在函数的开头应用一个锁,并在结尾处释放它。

假设您只想返回唯一的递增整数值,最简单的安全方法可能是使用私有静态计数器和私有静态锁对象。 就像是:

private static int s_UniqueCounter; // starts at 0 by default
private static readonly object s_UniqueCounterLock = new object();

public static int GetUnique()
{
    lock (s_UniqueCounterLock)
    {
        s_UniqueCounter++;
        return s_UniqueCounter;
    }
}

您需要确保使用特定的锁对象来保护对静态计数器成员的任何其他访问(当然,这就是为什么将它们声明为私有的原因,因此拥有它们的类可以控制任何访问)。 为此用途,可能不应该在其他任何地方访问它,但是您可能会对当前值有所了解,以查看它被调用了多少次。 那可能也应该受到锁的保护(以确保结果是最新的):

internal static int QueryUniqueCount() // or this could be private, or public
{
    lock (s_UniqueCounterLock)
    {
        return s_UniqueCounter;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM