3

我的问题是关于类函数的线程安全。这是我拼凑起来的一些测试代码,试图更好地理解。

public sealed class Singleton
{  
    public static Singleton Instance { get { return _lazyInit.Value; } }

    private static readonly Lazy<Singleton> _lazyInit = new Lazy<Singleton> (() => new Singleton());

    public long ExecuteAlgorithm(int n)
    {
            n += 2;
            return new Algorithm().Fibonacci(n);
    }
}

public class Algorithm
{
    public long Fibonacci(int n)
    {
        long a = 0;
        long b = 1;

        for (long i = 0; i < n; i++)
        {
            long temp = a;
            a = b;
            b = temp + b;
        }
        return a;
    }
}

}

Singleton 类的创建是安全的,但我的问题是关于函数 ExecuteAlgorithm 的使用。多线程使用 ExecuteAlgorithm() 是否安全?

我的理解是它应该不会导致任何竞争条件,因为创建的每个线程都有自己的堆栈,其中局部函数变量将被推送到其中,然后算法实例的创建将在应用程序范围的堆中创建。

我的理解正确吗?

4

1 回答 1

5

那是对的。您没有可访问的共享状态ExecuteAlgorithm(),因此不可能出现线程问题。

ExecuteAlgorithm()也可能是静态的,至少就多线程安全而言。也是如此Fibonacci()

于 2013-05-22T20:15:17.447 回答