当前位置: 首页 > news >正文

海南省海口市建设厅网站网站建设要学哪些东西

海南省海口市建设厅网站,网站建设要学哪些东西,海洋网络专业网站建设,网站免费正能量小说经过前面对线程的尝试使用#xff0c;我们对线程的了解又进一步加深了。今天我们继续来深入学习线程的新知识 —— 线程同步。 01、什么是线程同步 线程同步是指在多线程环境下#xff0c;确保多个线程在同时使用共享资源时不会发生冲突或数据不一致问题的技术#xff0c;保…经过前面对线程的尝试使用我们对线程的了解又进一步加深了。今天我们继续来深入学习线程的新知识 —— 线程同步。 01、什么是线程同步 线程同步是指在多线程环境下确保多个线程在同时使用共享资源时不会发生冲突或数据不一致问题的技术保证线程间的正确协作。它的目的是使得多个线程在执行过程中能够按照某种顺序、安全地使用共享资源。 02、为何需要线程同步 1、避免竞争条件 不知道大家还记得在《并发编程 - 初识线程》中出现的关键字volatile和特性ThreadStatic吗它们都是为了解决多线程共享资源问题。 在多线程中当多个线程需要同时使用共享资源时很容易产生互相竞争资源使用权的情况这一问题也叫竞争条件。此时就可以通过线程同步技术实现多个线程按顺序使用共享资源从而避免竞争条件。 2、保证共享资源安全 我们举个简单的例子假如我的银行账户里有1000元此时我正在用电子银行在线上操作准备向我老婆的账户里转账100元而恰巧此时我老婆拿着我的银行卡准备取款500。 假如银行系统还是一个只有多线程没有线程同步功能的老系统在这一前置条件下。假如恰巧我们俩在同一瞬间点了确认操作相信此时系统会发生什么 有可能会是系统同时收到我们俩的请求此时我的操作线程A首先读取我账户余额1000然后执行转账操作把余额减100得到900再更新至余额中。而我老婆的操作线程B因为是和我同时的所以在读取我账户余额的时候得到的也是1000而不是900此时线程B执行取款500操作把余额减500得到500再更新至余额中。 可以发现我们俩最后更新余额无论谁更新成功最后结果都是不正确的。这个例子就导致银行账户余额最终不正确也就是我们说的共享资源不安全。如果使用线程同步使得线程A、B可以按顺序执行无论谁先执行最终结果都会是正确的。 下面我们再来结合代码举一个经典问题 —— torn read。 先解释一下什么叫torn read可以翻译成一次读取被撕成两半。或者说在机器级别上要分两个MOV指令才能读完。 具体来说就是一个long类型变量_var当一个线程把_var赋值为0x0123456789ABCDEF,而此时另一个线程来读取_var,结果读取的值是0x0123456700000000或0x0000000089ABCDEF。这同样是因为多线程导致的共享资源不安全问题。 下面看看模拟代码实现效果 public class ThreadSync {//共享的int64变量public static long _var; public static void Run(){//启动写入线程var writerThread new Thread(WriteToSharedValue);//启动读取线程var readerThread new Thread(ReadFromSharedValue);//启动线程writerThread.Start();readerThread.Start();//等待线程执行完成writerThread.Join();readerThread.Join();}//写入线程static void WriteToSharedValue(){//模拟分两步写入long high 0x01234567;long low 0x89ABCDEF;unsafe{//将 _var 分成高低两部分写入//写高 32 位_var high 32;// 确保读取线程能在这里读取中间值Thread.Sleep(0); //写低 32 位_var | low;}Console.WriteLine($写: 写入值 0x{_var:X16});}//读取线程static void ReadFromSharedValue(){// 读取共享变量的值Console.WriteLine($读: 读取值 0x{_var:X16});} }我们看下执行效果 当然上面的例子并不是每次都会出现的可能需要多运行几次另外关于写入线程为什么不是直接赋值而是把值拆成高低位分两次写入 这是因为我的电脑是64位系统在大多数现代的 x64 系统架构例如 Intel 和 AMD 处理器上64 位的原子性操作通常是被保证的。即使对于像 long64 位这种数据类型处理器通常会在硬件层面确保它的读写操作是原子性的因此不太容易发生撕裂的读torn read。 所以这里的代码把一次赋值行为认为拆解成两步同时Thread.Sleep(0)也为了让当前线程主动让出 CPU 时间片使读线程有机会读取使其更贴近在x32环境下运行的情况。如果有条件可以用直接赋值再x32环境下看看效果。 03、如何实现线程同步 1、避免资源共享 当然严格意义上说可能这一条不算是线程同步只能说解决了多线程碰到的问题达到线程同步的效果。 如果没有共享资源那么自然就无须进行线程同步。大多数时候可以通过重新设计程序来除移共享状态从而去掉复杂的同步构造。尽可能避免在多个线程间使用单一对象。 除了通过重新设计来移除共享状态还可以通过语言特性设计使其达到无共享状态。比如值类型在传递过程中总是被复制每个线程都会有自己的数据副本比如看下面这个方法 public static int Max(int val1, int val2) { return val1 val2 ? val1 : val2; }即使这个方法没有使用任何线程同步方法这个方法也是线程安全的。因为值类型特性原因所以传给Max的两个int值会复制到方法内部形成自己的数据副本。此时无论有多少个线程调用Max方法每个线程处理的都是它自己的数据线程之间并不会互相干扰。 2、用户模式同步机制 用户模式同步机制指在用户空间内完成线程的阻塞和唤醒操作由程序自己管理同步对象的一种同步方式因为不涉及与操作系统内核交换因此开销较低更轻量级。 实现方式有SpinLock、SpinWait、Monitorlock等。 3、内核模式同步机制 内核模式同步机制是指在操作系统内核空间就完成线程的挂起与恢复由操作系统管理同步对象的一种同步方式因为每次线程同步操作都需要操作系统参与因此必然回涉及内核态的上下文切换同时还是涉及到操作系统内部的数据结构和资源管理因此内核模式同步机制往往会导致较高的开销。 实现方式有Semaphore、Mutex、AutoResetEvent等。 4、混合模式同步机制 混合模式同步机制在某些情况下会根据线程竞争的情况在用户模式和内核模式之间切换。通常当资源访问冲突较小或线程阻塞较少时采用用户模式同步当资源争用较多或有较大的线程等待时自动切换到内核模式同步。 实现方式有SemaphoreSlim、ManualResetEventSlim、CountDownEvent、Barrier、ReaderWriterLockSlim等。 注测试方法代码以及示例源码都已经上传至代码库有兴趣的可以看看。https://gitee.com/hugogoos/Planner
http://www.w-s-a.com/news/674305/

相关文章:

  • 秦皇岛网站建设系统推荐个人网站免费制作
  • 我做夫人那些年网站登录wordpress 扫码付费
  • 网站关键词代码怎么做公司 网站建设
  • 哈尔滨多语言网站建设wordpress分类链接
  • 购物网站项目介绍软件开发流程的五大步骤
  • 做的网站怎么放在网上2008 iis搭建网站
  • 网站维护服务公司上海兼职网站制作
  • 企业做网站需要多少钱湘潭九华网站
  • 嘉兴建站服务微营销官网
  • 比较好的网页模板网站浦项建设(中国)有限公司网站
  • 有趣的个人网站网页设计与制作的岗位职责
  • 有建设网站的软件吗长沙做网站的公司对比
  • 网站的外链接数中铝长城建设有限公司网站
  • 北京建设网站公司网站建设费用 无形资产
  • 适合seo的建站系统如何建立网页
  • 我想自己建立一个网站给大家分享个永久免费的云服务器
  • 怎样做网站和网站的友情链接官网优化 报价
  • 购买网站空间大小聊城网站空间公司
  • 做像美团淘宝平台网站多少钱开发网站企业
  • 网站建设前期费用二手购物网站策划书
  • dede学校网站百度联盟是什么
  • 献县网站建设网站开发专业定制
  • 龙华做网站yihe kj安徽六安彩礼一般给多少
  • flash网站建设公司我的小程序在哪里找
  • 建网站需要数据库吗如何制作简单的网页链接
  • 杭州设计企业网站高端公司上虞做网站公司
  • 做网站能赚钱么用wordpress搭建知名网站
  • 阿里云服务器网站开发青岛做网站找哪家
  • 凡科做的网站为什么打不开织梦cms仿某作文网站整站源码(带采集)安装数据库
  • 免费h5模板网站模板汽车报价网址