VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 855|回复: 9

C#中的公共静态成员的问题

[复制链接]

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-2-1 14:40:01 | 显示全部楼层 |阅读模式
最近使用C#中的公共成员时遇到了麻烦了,望高手指点指点。

据说静态成员有利于提高程序的运行效率,最近在一个负载相当高的网站中asp.net的bin目录中所有的类成员都写成了静态。对于程序速度,发现使用静态成员比每次实例化一个类确实要高得多。

但是,在访问人数多的情况下,问题出现了,发现程序的运行结果不对了。
例如
private static int A;
public static GetA2(int a)
{
    A = a;
    return A*A;
}
由于asp.net是典型的多线程应用程序,当多个线程同时执行这组代码时,就产生错误。
查看了 .net 2.0 SDK,其中说,要用lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。

反正我看是看不懂也弄不清了,我基础又差。

向高手们请教什么是临界区,我这个问题该怎么办?是要将类成员全部改为实例成员吗?
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-3-13 23:00:01 | 显示全部楼层
private static int A;
public static int GetA2(int a)
{
    A = a;
    return A*A;
}
回复

使用道具 举报

0

主题

7

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-3-14 21:45:01 | 显示全部楼层
这个方法的实例开销应该不大,没必要用成static

你把字段private static int A;
去掉静态试试
回复

使用道具 举报

0

主题

26

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-3-14 22:00:01 | 显示全部楼层
静态变量相当于一个程序域的全局变量,只有唯一的一份实例,当多个线程对这样的变量进行操作的时候使用lock以确保当前只能有一个线程在对其进行工作,其他线程将会等待直到该静态变量被lock释放,如果不对其进行lock操作,那么多个线程对静态变量进行抢占操作将可能会引起异常.
就像茅坑一次只足够让一个人进去,使用者在使用前要锁门防止另一个人进入,如果你不锁门,别人别人憋不住了非要和你挤,那么结果......不知道......
回复

使用道具 举报

0

主题

31

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-3-15 12:30:01 | 显示全部楼层
临界区其实就是对象监视器
因为多线程的运行是无序的
如:线程1进入方法,运行A=a;,但还没有运行return A*A;
CPU时间片被抢占,另一个线程进入运行,传入了新的a值,因为是静态的
所以第二个线程对A值的更改会影响第一个线程,造成返回值错误,而实例不会发生这种问题

如果有必要的话,对这个数做同步吧,或者不要缓存A,除非共享的变量,最好不要用静态,同步影响性能,同步方法很多,比如lock,mutex等,单增变量还一个呢
回复

使用道具 举报

0

主题

27

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-3-16 18:45:01 | 显示全部楼层
可以用三种方法来加锁mutex , lock , monitor,其中lock最简单,如下:
private static int A;
public static int GetA2(int a)
{
   lock(this)
   {
    A = a;
    return A*A;
   }
}
回复

使用道具 举报

0

主题

7

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-3-17 06:45:01 | 显示全部楼层
加了锁执行中,其他也要执行的,只能等解锁。人以多页面都打不开了。
回复

使用道具 举报

0

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-3-18 01:45:01 | 显示全部楼层
没看懂
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-7-16 20:00:01 | 显示全部楼层
在高负载(每秒处理请求达1000)的asp.net应用程序中,对于类的属性成员,是不是静态的还不如实例的???

对于只使用局部变量的成员方法,到底受不受多线程的影响??
谢谢各位。
回复

使用道具 举报

0

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-7-18 08:15:01 | 显示全部楼层
有一定的启发!!!!!!!!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表