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

在哪个网站做网上兼职靠谱吗中文域名

在哪个网站做网上兼职靠谱吗,中文域名,奉贤长沙网站建设,怎样做响应式网站并发级别 由于临界区的存在,多线程之间的并发必须受到控制。根据控制并发的策略,我们可以把并发的级别分为 阻塞、无饥饿、无障碍、无锁、无等待 几种。 阻塞 一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执…

并发级别

由于临界区的存在,多线程之间的并发必须受到控制。根据控制并发的策略,我们可以把并发的级别分为 阻塞、无饥饿、无障碍、无锁、无等待 几种。

阻塞

一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。当我们使用sychronized关键字或者重入锁时,我们得到的就是阻塞的线程。

sychronized关键字和重入锁(ReentrantLock)都试图在执行后续代码之前,得到临界区的锁,如果得不到,线程就会被挂起等待,直到占有了所需资源为止。

无饥饿

如果线程之间是有优先级的,那么线程调度的时候总是倾向于满足高优先级的线程。即,对于同一个资源的分配,是不公平的。

对于非公平锁,系统允许高优先级的线程插队,这样有可能导致低优先级线程产生饥饿。

如果锁是公平的,按照先来后到的原则,那么饥饿就不会产生。所有线程都有机会执行。

无障碍

无障碍是一种最弱的非阻塞调度(乐观锁)。两个线程无障碍的执行,那么不会因为临界区的问题导致一方被挂起,对于无障碍的线程来说,双方共同修改临界区的资源,如果一方把资源修改坏,会立即对自己所做的修改进行回滚,确保数据安全。

阻塞的控制方式属于悲观策略,无障碍(非阻塞)的调度就是一种乐观策略。

一种可行的无障碍实现可以依赖一个“一致性标记”(版本号或者CAS机制都依赖于这种实现),线程在操作之前,先读取并保存这个标记,在操作完成后,再次读取,检查这个标记是否被更改过,如果两者一致,则说明资源访问没有冲突。如果不一致,则重试操作。

无锁

无锁的并行都是无障碍的。在无锁的情况下,所有的线程都能尝试对临界区进行访问,但不同的是,无锁的并发保证必然有一个线程能够在有限步内完成操作离开临界区。

在无锁的调用中,一个典型的特点是可能会 包含一个无穷循环。在这个循环中,线程会不断尝试修改共享变量。如果没有冲突,修改成功,程序退出,否则继续尝试修改。 但无论如何,无锁的并行总能保证有一个线程是可以胜出的。

如下:
在这里插入图片描述

无等待

无锁只要求有一个线程可以在有限步骤内完成操作,而无等待要求所有线程必须在有限步骤内完成。这样就不会引起饥饿问题。如果限制这个步骤的上限,还可以进一步分解为有界无等待和线程数无关的无等待几种。

一种典型的无等待结构是RCU(Read Copy Update).他的基本思想是,对数据的读不加控制,在写数据的时候,先取得原始数据的副本,接着只修改副本数据,修改完成后,在合适的时机写回数据。(COW 写时复制)

Java内存模型(JMM)

JMM的关键技术点都是围绕着多线程的原子性、可见性和有序性来建立的。

原子性

原子性指一个操作是不可中断的。即使在多个线程在一起执行的时候,一个操作一旦开始就不会被其他线程干扰。

可见性

可见性是指当一个线程修改了某一个共享变量的时候,其他线程是否能够立即知道这个修改。

在CPU1和CPU2上各运行一个线程,他们共享变量t,由于编译器优化或者硬件优化的缘故,在CPU1上的线程将变量t缓存到cache或者寄存器中,在这种情况下,CPU2上的线程对共享变量做了修改,CPU1上的线程无法意识到这种改动,依然会读取缓存值。因此,产生了可见性问题。

有序性

有序性问题的原因是程序在执行时,可能会进行指令重排,重排后的指令与原本的顺序未必一致。

串行执行的线程不存在指令重排问题,但是多线程间可能会存在,且是否发生指令重排不可预见。

为什么会发生指令重排

之所以发生指令重排,完全是出于性能考虑。一条指令执行是可以分为很多步骤,如下

  • 取址IF
  • 译码和取寄存器操作数ID
  • 执行或者有效地址计算EX
  • 存储器访问MEM
  • 写回WB

在CPU实际工作中,汇编指令也需要多个步骤依次执行。由于每个步骤都可能使用不同的硬件来完成,如取址时用到PC寄存器或者存储器。执行时用到ALU(算术逻辑单元)。为了提高性能,发明了流水线技术来执行指令。
在这里插入图片描述
可以看出,当第二条指令执行时,指令一并未执行完成,有了流水线,CPU才能真正高效的执行。但是,流水线总是害怕被中断。流水线满载时,性能确实相当不错,但是 一旦中断,所有的硬件设备都会进入一个停顿期,再次满载又需要几个周期。因此,性能损失就很大,所以,必须想办法尽量不让流水线中断。之所以需要指令重排,就是为了尽量减少中断流水线。

示例如下:

执行操作

a = b+c;
d = e-f;

指令重排前执行过程
在这里插入图片描述
由于ADD、SUB操作都需要等待上一条指令的结果,因此,在这里插入了不少停顿。通过将LW Rf,f和LW Re,e移动到前面执行即可。因为先加载e和f对程序是没有影响的,既然在Add的时候要停顿一下,那么停顿的时间不如去做点有意义的事情,指令重排后如下:
在这里插入图片描述
由此可见,指令重排对于CPU处理性能是十分必要的。

哪些指令不能重排:Happen-Before规则

Java虚拟机和执行系统会对指令进行一定的重排,但是指令重排是有原则的,并非所有的指令都可以随便改变执行位置。以下罗列了一些基本原则:

  • 程序顺序原则:一个线程内保证语义的串行性。
  • volatile原则:volatile变量的写先于读发生,这保证了volatile变量的可见性(当一个线程修改volatile变量时,新的值会被立即刷新到主内存中,并且其他线程能够立即看到这个更新
  • 锁规则:解锁必然发生在随后的加锁前。
  • 传递性:A先于B,B先于C,那么A必然先于C。
  • 线程的start()方法先于他的每一个动作。
  • 线程的所有操作先于线程的终结(Thread.join())
  • 线程的中断先于被中断线程的代码
  • 对象的构造函数的执行、结束先于finalize()方法。
http://www.wangmingla.cn/news/61242.html

相关文章:

  • 调兵山 网站建设宁波seo入门教程
  • 有什么网站可以自己做书搜索引擎营销流程是什么?
  • 免费下载手机app韶关网站seo
  • 前程无忧招聘网站标记怎么做企业培训网
  • 昌平做网站公司菏泽seo
  • 重庆免费建站公司地址百度推广收费多少
  • 千博网站后台竞价 推广
  • 汕头住房和城乡建设厅网站国际新闻今天最新消息
  • 网站开发 网站建设关键词排名工具有哪些
  • 俞润装饰做哪几个网站关键词优化公司哪家好
  • Wordpress可以访问么seo外链优化
  • 模拟百度搜索词进入网站今日小说排行榜风云榜
  • 网站做虚假宣传有没有做处罚杭州网站推广大全
  • 体育西网站开发价格天津网站排名提升多少钱
  • 郑州企业做网站搜索引擎广告案例
  • 做性的视频网站自助建站系统平台
  • 清远做网站的百度权重查询爱站网
  • 汕头网站成都seo工程师
  • 华硕路由器做网站软文代发平台
  • 域名做违法网站网络培训心得体会
  • 重庆网站推广营销代理视频app推广
  • 手机评测网站电脑系统优化软件十大排名
  • 网站开发公司营业范围湖北seo
  • 网站建设教程 迅雷下载惠州seo推广外包
  • 自己可以模拟装修app网站seo推广优化
  • wordpress 网页存在百度排名优化
  • 做吉祥物设计看什么网站中国十大电商公司排名
  • 请人做软件开发的网站海外推广营销 平台
  • 精品国内网站建设新媒体运营
  • 做电影网站要几G空间的小程序开发费用一览表