C#静态方法在多用户并发访问时,运行情况到底是什么样?是排队等待?还是并发的?

本文通过一个简单的C#示例程序验证了静态方法在多用户并发访问时的行为,并发执行而非排队等待。通过模拟三个用户同时调用同一个静态方法,观察输出结果,了解静态方法在并发环境下的执行特性。

曾经有个错误的认识,一直以为静态方法在多用户并发下会是排队等待,一个个执行,前些日子与朋友 单程列车 http://www.cnblogs.com/zhaojingjing/  一起做了测试后才发现,原来是并发执行的,绝对不会排队等待。

   写程序的不能怕丢人有错就改,积极改正错误,一天比一天上一个台阶就好。

 

模拟并发的测试代码如下,希望对有需要的朋友提供的方便的参考

复制代码
// --------------------------------------------------------------------
//  All Rights Reserved , Copyright (C) 2011 , Hairihan TECH, Ltd. 
// --------------------------------------------------------------------

namespace  DotNet.Example
{
    
using  DotNet.BaseManager;

    
public   class  StaticTest
    {
        
///   <summary>
        
///  定义委托
        
///   </summary>
        
///   <param name="user"> 用户 </param>
         delegate   void  MakeStaticDelegate( string  user);

        
///   <summary>
        
///  这里是测试静态方法
        
///   </summary>
        
///   <param name="user"> 用户 </param>
         private   static   void  MakeStaticTest( string  user)
        {
            
for  ( int  i  =   0 ; i  <   10 ; i ++ )
            {
                
//  输出当前的变量
                System.Console.WriteLine(user  +   " "   +  i.ToString());
                System.Threading.Thread.Sleep(
1000 );
            }
        }

        
///   <summary>
        
///  这里是模拟多用户同时点击并发
        
///   </summary>
         public   void  DoTest()
        {
            
//  模拟3个用户的并发操作
            MakeStaticDelegate makeStaticDelegate1  =   new  MakeStaticDelegate(MakeStaticTest);
            makeStaticDelegate1.BeginInvoke(
" user1 " null null );
            MakeStaticDelegate makeStaticDelegate2 
=   new  MakeStaticDelegate(MakeStaticTest);
            makeStaticDelegate2.BeginInvoke(
" user2 " null null );
            MakeStaticDelegate makeStaticDelegate3 
=   new  MakeStaticDelegate(MakeStaticTest);
            makeStaticDelegate3.BeginInvoke(
" user3 " null null );
            System.Console.ReadLine();
        }
    }
复制代码

} 


转自:C#静态方法在多用户并发访问时,运行情况到底是什么样?是排队等待?还是并发的? - 通用C#系统架构 - 博客园
http://www.cnblogs.com/jirigala/archive/2011/03/01/1968192.html

C#中,静态方法在多线程环境下使用,有以下注意事项: - **线程安全取决于是否操作静态成员**:静态方法不对特定的实例操作,只能访问静态成员,在多线程中使用同一个静态方法,每个线程使用各自的实例字段的副本,而共享一个静态字段。如果该静态方法不去操作一个静态成员,只在方法内部使用实例字段,不会引起安全性问题。但是,如果该静态方法操作了一个静态字段,则需要在静态方法中采用互斥访问的方式进行安全处理。例如,下面的代码中,`SafeStaticMethod` 操作了静态字段 `staticField`,需要使用 `lock` 语句保证线程安全: ```csharp class Program { private static int staticField = 0; private static readonly object lockObject = new object(); public static void SafeStaticMethod() { lock (lockObject) { staticField++; } } public static void UnsafeStaticMethod(int instanceField) { // 只使用实例字段,线程安全 int result = instanceField * 2; } } ``` - **数据共享可能导致问题**:由于静态类的成员是共享的,在多线程环境下可能会导致数据不一致或并发访问问题。如果多个线程同访问和修改静态类中的数据,需要采取适当的同步措施,如使用 `lock` 语句或其他并发控制机制[^4]。 - **使用 `ThreadStatic` 属性**:`ThreadStatic` 是C#中的一种属性,它标记一个静态字段为每个线程提供单独的存储空间。这意味着即使在不同的线程上访问相同的静态字段,它们实际上将指向不同的内存位置。这非常适合于需要在线程间保持独立状态的场景[^3]。示例如下: ```csharp class Program { [ThreadStatic] private static int threadStaticField; public static void StaticMethod() { threadStaticField++; Console.WriteLine($"Thread ID: {System.Threading.Thread.CurrentThread.ManagedThreadId}, Value: {threadStaticField}"); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值