首页 / 知识
关于c#:Instance构造函数设置一个静态成员,线程安全吗?
2023-04-14 01:58:00

Instance constructor sets a static member, is it thread safe?
我正在重构一些代码,并且想知道实例构造函数中
请确认 如果原始程序员的意图是让每个实例知道其"计数",那么我将如何同步对" counter"成员的访问,以确保另一个线程不是新的" x1"并在此之前更改计数 一盘算一下? 仅供参考-此类不是单身人士。 实例必须仅知道其编号。 如果只增加一个数字,那么有一个特殊的类(互锁)... http://msdn.microsoft.com/zh-CN/library/system.threading.interlocked.increment.aspx
有关线程最佳实践的更多信息... http://msdn.microsoft.com/zh-CN/library/1c9txz50.aspx 我猜这是针对单例模式或类似的东西。您要做的不是锁定对象,而是在修改计数器时锁定计数器。
因为您当前的代码有点多余。特别是在构造函数中,只有一个线程可以调用构造函数,这与方法可以在多个线程之间共享并可以从任何共享的线程访问的方法不同。 从我能从您的代码中得知的一点,您正在尝试为对象创建时提供当前计数。因此,使用上述代码,计数器将在更新和本地设置时被锁定。因此,所有其他构造函数都必须等待计数器释放。 @ajmastrean 我并不是说您应该使用单例模式本身,而是采用其封装实例化过程的方法。 即
编辑 我想过的一个问题是,如果您怎么知道什么时候计数下降了? ;) 再次编辑 考虑一下,您可以将代码添加到析构函数中,以调用另一个静态方法来减少计数器:D 您可以使用另一个静态对象对其进行锁定。
并将此对象锁定在构造函数中。
但是,由于 实现此目的的最有效方法是使用"互锁"增量操作。它将增加计数器并一次(原子地)返回静态计数器的新设置值。
在您的原始示例中,lock(this)语句将不会具有预期的效果,因为每个单独的实例将具有不同的" this"引用,因此多个实例可以同时更新静态成员。 从某种意义上讲,可以将构造函数视为线程安全的,因为在构造函数完成之前看不到对正在构造的对象的引用,但这对保护静态变量没有任何好处。 (Mike Schall首先拥有互锁位) @抢 仅供参考,此类可能不是单例,我需要访问其他实例。他们必须简单地保持计数。您将更改单例模式的哪一部分以执行"计数器"增量? 或者您是在建议我公开一个静态方法来构造访问,以阻止访问递增且带锁的计数器的代码。
我认为,如果您修改单例模式以包括计数(显然使用线程安全方法),则可以:: 编辑 废话我不小心删除了! 我不确定实例构造函数是否是线程安全的,我记得在设计模式书中读过有关此内容的文章,您仅出于此原因就需要确保在实例化过程中锁定到位。 |
最新内容
相关内容
linux命令长度设置?
linux命令长度设置?,地址,工作,命令,管理,环境,系统,信息,目录,文件,参数,Linux下使用exec时,命令行参数长度有限制吗对于新程序的命令行参数linux双ip设置命令?
linux双ip设置命令?,地址,系统,代码,网络,设备,服务,通讯,名称,信息,密码,linux双网卡双IP双网关如何配置一般情况下,默认网关已经自动设置好了linux用户组命令设置?
linux用户组命令设置?,管理,系统,密码,代码,电脑,用户组,用户,软件,新增,命令,linux怎么设置用户组1、首先我们需要在电脑上打开linux操作系统linux密钥设置命令?
linux密钥设置命令?,密码,服务,数据,认证,环境,官网,系统,概念,通信,管理,如何保证Linux服务器的安全实际上,SSH不仅可以保障Linux主机之间的安命令行怎么设置linux?
命令行怎么设置linux?,系统,工作,命令,密码,信息,地方,工具,终端,文件,目录,切换Linux系统下图形界面与Linux命令行模式手工切换:在图形界面中linux内核设置命令?
linux内核设置命令?,系统,信息,工作,管理,地址,命令,名称,情况,发行,目录,如何用命令行设置linux内核参数1、sudo -e /etc/default/grub GRUB_linux设置任务命令?
linux设置任务命令?,工作,时间,系统,周期,定期,管理,信息,命令,任务,目录,linux定时任务多个时间点执行分钟小时 天 月 星期 要执行的命令前面linux设置开机命令?
linux设置开机命令?,设备,标准,系统,工作,服务,代码,命令,方式,级别,电源,重启服务器的linux命令首先我首要把linux开机, 命令 rebot 这个是lin设置linux分辨率命令?
设置linux分辨率命令?,系统,情况,分辨率,屏幕分辨率,屏幕,两边,桌面,命令,选项,终端,怎样设置Linux系统分辨率1、如下图,我们可以看到我们的屏linux路由器命令设置?
linux路由器命令设置?,网络,信息,系统,代码,地址,路由,名称,环境,情况,工作,linux如何配置路由?注:其中第一条配置的为默认路由,默认路由掩码和linux设置串口命令?
linux设置串口命令?,设备,信息,系统,数据,一致,代码,项目,波特率,文件,操作,linux串口关闭流控代码cs8使用linux的串口命令对串口参数进行设置linux刷新率设置命令?
linux刷新率设置命令?,系统,数字,分辨率,传播,情况,频率,屏幕,桌面,命令,屏幕分辨率,我刚安装了LINUX5,但是桌面的分辨率只有640x480和800x600