安全地获取序列号线程

时间:2015-08-13 14:48:48

标签: c# multithreading thread-safety

我有一个ASP.NET应用程序,在使用实体框架在表中创建记录时,我使用数据库序列中的序列号。我有一个存储过程,它检索从实体框架调用的此序列中的下一个值,我想确保此检索是线程安全的。

我使用this回答在以下类中尝试此操作:

public static class SequenceNumber
{
    private static object Lock = new object();

    public static long Next(Context db)
    {
        long next = 0;

        lock (Lock)
        {
            next = db.GetNextComplaintNumber().Single().Value;
        }

        return next;
    }
}

这会确保线程安全吗?

1 个答案:

答案 0 :(得分:1)

Next(...)方法将是线程安全的,但db.GetNextComplaintNumber()将不会(除非它被实现)。锁确保任何调用Next(...)的线程都必须等待它们运行lock语句中的任何内容。但是,如果任何其他线程有权访问对象db,那么他们可以有效地调用db.GetNextComplaintNumber()而无需调用Next(...)方法,因此它不会受到lock语句的保护。如果你能保证db.GetNextComplaintNumber()只在Next(...)方法中调用,那么你应该是安全的,否则你会想要在db.GetNextComplaintNumber()方法中实现线程安全。