.NET 6 新特性 —— Random.Shared

.NET 6 新特性 —— Random.Shared

Intro

最近微软发了一篇 .NET 6 性能提升的博客文章,里面提到了很多有趣的东西,其中有一个是 Random.Shared

这是一个只读的静态属性,并且是一个线程安全的对象,这个东西可以帮助我们简化 Random 对象的使用

Before

首先我们需要知道 Random 不是线程安全的,所以我们如果要在多线程下用 Random 的话,通常需要考虑线程安全问题

既然不是线程安全的,那我们用的时候创建一个就好了,每次都 new 一个,但是这样的话一来代码不够简洁,二来可能会创建比较多的 Random 对象,那么不使用的时候每次 new 要怎么做呢?

比较简单的做法就是加一个锁,如下所示:

public static class RandomGen1
{private static Random _inst = new Random();public static int Next(){lock (_inst) return _inst.Next();}
}

但是这样的话会导致获取锁的效率相对来说会比较低,每次还需要去先拿到锁,所以也有别的解法:

public static class RandomGen2
{private static Random _global = new Random();[ThreadStatic]private static Random _local;public static int Next(){Random inst = _local;if (inst == null){int seed;lock (_global) seed = _global.Next();_local = inst = new Random(seed);}return inst.Next();}
}

上面是一个微软推荐的实现,那么为什么要两个 Random 对象呢,Random 对象产生随机数依赖于一个 seed,默认是使用当前时间,如果时间特别接近的话,会发现即使是不同的 Random 对象产生的随机数有可能是一样的

上面的 _global 对象是用于产生随机的 seed,避免使用默认的 seed,_local 是一个被标记为 ThreadStatic 的对象,每一个线程会拥有一个单独的 Random 对象从而避免线程安全问题。

Sample

有了 Random.Shared 之后,我们就不需要上面的封装了

Console.WriteLine(Random.Shared.Next(1, 100));Parallel.For(0, Environment.ProcessorCount, _ =>
{var thread = new Thread(() => {var arr = new int[10];for (var i = 0; i < arr.Length; i++){arr[i] = Random.Shared.Next(1, 100);}Console.WriteLine(arr.Average());});thread.Start();
});

Random.Shared 的实现也是类似于上面的 ThreadStatic 的解法,但是是从 CLR 的底层去实现的,会比上面的实现方式更为高效,实现代码可以参考 Github:https://github.com/dotnet/runtime/blob/v6.0.0-preview.7.21377.19/src/libraries/System.Private.CoreLib/src/System/Random.cs

More

使用新的 Random.Shared 对象之后就移除掉代码中大量的 new Random 或者自己封装的 Random 了,代码更加简洁了~~

References

  • https://github.com/dotnet/runtime/issues/43887

  • https://github.com/dotnet/runtime/pull/50297

  • https://github.com/dotnet/runtime/pull/50297/files#diff-6fa7e54f57878bb019a11332aeeb42c75430a0ac87c78cdfa9ce382137b3d851R51

  • https://github.com/dotnet/runtime/blob/v6.0.0-preview.7.21377.19/src/libraries/System.Private.CoreLib/src/System/Random.cs

  • https://devblogs.microsoft.com/pfxteam/getting-random-numbers-in-a-thread-safe-way/

  • https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Python CookBook2》 第一章 文本 - 检查字符串中是否包含某字符集合中的字符 简化字符串的translate方法的使用...

检查字符串中是否包含某字符集合中的字符 任务&#xff1a; 检查字符串中是否出现了某个字符集合中的字符 解决方案&#xff1a; 方案一&#xff1a; import itertoolsdef containAny(seq,aset):for item in itertools.ifilter(aset.__contains__,seq):return Truereturn False…

mysql高级查询 二_MySQL高级查询(二)

EXISTS 和NOT EXISTS子查询EXISTS子查询语法:SELECT ……… FROM 表名 WHERE EXISTS (子查询);例:SELECT studentNo AS 学号,studentResult 成绩 FROM resultWHERE EXISTS(/*查询LOgic Java最后一次考试成绩大于80的记录*/SELECT * FROM result WHERE subjectNo(SELECT subject…

What's blocking my lock? 转载

原文地址 &#xff1a;http://www.orafaq.com/node/854 Create a blocking lock To begin, create a situation where one user isactively blocking another. Open two sessions. Issue the following commands inSession 1 to build the test table: SQL> create table ts…

致家长:疫情期间教育好自己的孩子,就是你最重要的事业!

全世界只有3.14 % 的人关注了爆炸吧知识疫情危机&#xff0c;却也是教育的契机。现在孩子呆在家里&#xff0c;老师管不了孩子&#xff0c;却也正是家长重新认识父母之责的契机。家长才是孩子的第一任老师&#xff0c;家长的言传身教、一举一动都影响着孩子成长。孩子是你的唯一…

linux 安全审计

1,创建工作目录mkdir /usr/local/proxy/vi proxy#!/bin/bashTmpfilemktempUser$USERIp${SSH_CLIENT%% *}Date"date %Y-%m-%d"Logfile"/var/log/myaudit/${Date}_${User}_$Ip.log"exec /usr/bin/script -a -f -q $Logfile2 修改/etc/profilevi /etc/profile…

设计模式之访问者

访问者模式介绍访问者模式能将算法与其所作用的对象隔离开来。访问者模式建议将新行为放入要给名为访问者的独立类中&#xff0c;而不是试图将其整合到已有类中。它允许你在不修改已有代码的情况下向已有类层次结构中增加新的行为。需要执行操作的原始对象将作为参数被传递给访…

mysql没有东西的商品_MYSQL 对商品表没有主图的数据调整为下架的SQL脚本

在实际的场景中&#xff0c;存在一些商品&#xff0c;没有主图的信息&#xff0c;但是商品跟对应价格都是上架的&#xff0c;这时候用户叫你&#xff0c;把一些商品没有主图的&#xff0c;跟对应的价格都弄为下架&#xff0c;这时候你该如何处理&#xff1f;&#xff1f;在商品…

转-SQL 2005修改系统表

FROM&#xff1a;http://blog.csdn.net/liangCK/archive/2008/10/07/3029315.aspx 在 SQL Server 2000 中修改系统表的方法大部分人都知道&#xff0c;介绍如何在 SQL 2005 中修改系统表的资料目前还比较少&#xff0c;虽然微软不赞成修改系统表&#xff0c;而且也把修改系统表…

温州人的思维

思维&#xff08;1&#xff09;&#xff1a;商人&#xff1a;没人干过这种事&#xff0c;没有先例可循&#xff0c;万一砸了怎么办&#xff1f;温州人&#xff1a;没人干过怕什么&#xff1f;这样才没人跟你抢市场嘛&#xff0c;头道汤味道最好&#xff0c;先人一步的生意最赚钱…

清华男神再获世界大奖,从放牛娃到清华校长,他考研3次,读博7年,做出诺奖级的科研成果...

全世界只有3.14 % 的人关注了爆炸吧知识2月24日&#xff0c;菲列兹伦敦奖评奖委员会宣布&#xff0c;2020年度菲列兹伦敦奖将授予中国科学院院士、清华大学副校长、北京量子信息科学研究院院长薛其坤。帅气的老薛按照评奖委员会的通知&#xff0c;薛其坤是因为在实验上发现量子…

安装MHA中清理Relay log报错

安装MHA中清理Relay log报错[rootMHA3 ~]# /usr/bin/purge_relay_logs --userroot --password123456 -disable_relay_log_purge --port3306 --workdir/opt/mysql/data/2014-08-27 09:19:30: purge_relay_logs script started.install_driver(mysql) failed: Cant locate DBD/m…

mysql序列increment_MySQL 序列 AUTO_INCREMENT

MySQL序列是一组整数&#xff1a;1, 2, 3, ...&#xff0c;由于一张数据表只能有一个字段自增主键&#xff0c; 如果你想实现其他字段也实现自动增加&#xff0c;就可以使用MySQL序列来实现。本章我们将介绍如何使用MySQL的序列。使用AUTO_INCREMENTMySQL中最简单使用序列的方法…

SQL 语句中 where 条件后 写上1=1 是什么意思

前言where 11是sql语句条件逻辑判断表达式&#xff0c;由于11成立&#xff0c;恒为真&#xff0c;该表达式11将始终返回"真"。这种写法实际目的是为了获取逻辑值"True",其实诸如22, 123&#xff0c;中中等之类的写法都可以返回逻辑值"True"&…

介绍自定义JDataGrid电子表格版本公式中的函数?

2019独角兽企业重金招聘Python工程师标准>>> How to write function in JDataGrid Spreadsheet Edition? 1. Understand the formula and function API used in JDataGrid Spreadsheet Edition? Obviously you should understand the “Function” and it’s su…

最新研究!新冠病毒被定义为“大流行”背后,竟然还藏着这样凶险的大杀器?...

全世界只有3.14 % 的人关注了爆炸吧知识你知道当一种疾病被定义为大流行&#xff08;pandemic&#xff09;时意味着什么吗&#xff1f;大流行&#xff08;pandemic&#xff09; 是指一种疾病在短时间内越过省界国界甚至洲界在全世界范围内流行。历史上&#xff0c;有很多疾病都…

js javaScript array 取指定元素索引、判断是否相同、重复、过滤数据

最近写js也多了&#xff0c;Array中有好多方法不够用。自己加了些以后还可能用到。 <script type"text/javascript"> //找到返回所在索引&#xff0c;不存在返回-1 Array.prototype.index function (el) { var i 0; for (var i 0, len this.length; i <…

Linux下查看进程对应的命令绝对路径

为什么80%的码农都做不了架构师&#xff1f;>>> 由于开发环境混乱&#xff0c;多人共享一台物理机&#xff0c;部分软件不是通过系统管理软件中心安装&#xff08;例如&#xff1a;rpm&#xff0c;apt-get&#xff09;, 同时启动软件是在软件当前目录执行 ./XXX 。…

请收藏!这可能是目前最安全的数据加密传输解决方案

问题为了安全性起见&#xff0c;客户要求客户端必须将数据加密后才能传给服务端。起先&#xff0c;准备使用非对称加密&#xff08;RSA&#xff09;方式&#xff0c;但是发现它对原始文本长度有限制。而对称加密(AES)没有长度限制&#xff0c;但是使用固定密钥存在暴露的风险。…

mysql kill hup_kill -HUP pid

kill -HUP pid其中 pid 是进程标识。如果想要更改配置而不需停止并重新启动服务&#xff0c;请使用该命令。在对配置文件作必要的更改后&#xff0c;发出该命令以动态更新服务配置。根据约定&#xff0c;当您发送一个挂起信号(信号 1 或 HUP)时&#xff0c;大多数服务器进程(所…

Windows Live Essentials Wave3 QFE 官方各组件独立安装包

版本是14.0.8064.0206&#xff0c;签名日期为&#xff1a;2009-2-7 可根据自己的需要选择下载安装&#xff01;均可安装在SERVER版上&#xff01; Live Messenger | Live contacts &#xff08;安装Live Messenger的话&#xff0c;contacts 必须&#xff09; Live Writer Live …