技术标签: JAVA
本文参考自------------------------------>>>:并发编程网
充分利用CPU资源,帮助我们编写出高性能的程序。
ps:如果视而不见(并发问题),终将遭其反噬。
通常,并发都是提高运行在单处理器上的程序性能;(事实上,如果没有阻塞。那么在单处理器上的使用并发毫无意义。)
java线程机制都是抢占式的,即调度机制会周期性的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片,使得每个线程都会分配到数量合理的时间去驱动他的任务。
协作多线程:每个任务都会自动放弃控制,由程序员有意识的插入让步语句;
协作的优势:上下文切换的开销比抢占式要小很多。
基本的线程机制:
并发编程将程序分为多个分离的、独立运行的任务;通过使用多线程机制,这些独立任务每一个都将由执行线程来驱动
(一个线程就是在进程中一个单一的顺序控制流)。每个任务(线程)都会“认为”自己一直占用CPU,但事实上CPU时间是划分成片段分配给了所有任务。
1.设计更加复杂;
2.上下文切换的开销:当CPU从执行一个线程切换到另一个时,它需要先存储当前线程的本地数据、程序指针等,然后载入另一个
线程的本地数据、程序指针等,最后才开始执行。这种切换称为“上下文切换”。
3.增加资源消耗:线程在运行时除了使用CPU,还需要一些内存来维持他本地的堆栈,也需要占用操作系统中一些资源来管理线程。
并发系统可以采用多种并发模型来实现。并发模型指定了系统中的线程如何通过写作来完成分配给他们的作业。
工作原理图 工作原理图(访问共享数据)
在并行工作者模型中,委派者(Delegator)将传入的作业分配给不同的工作者。每个工作者运行在不同的线程上,甚至不同的CPU上。
如果在某个汽车厂里实现了并行工作者模型,每台车都会由一个工人来生产。工人们将拿到汽车的生产规格,并且从头到尾负责所有工作。
优点:易理解。提高系统的并行度只需要添加更多worker。
缺点:
①共享状态可能很复杂。当涉及到对共享数据的操作时,情况就变得复杂起来了。当某一个线程对共享数据进行存取操作时,也要确保被其他线程可见。线程需要避免竟态,死锁以及很多其他共享状态的并发性问题。此外,在执行需要访问共享数据结构部分的代码时,高竞争基本上会导致执行时出现一定程度的串行化,线程之间的互相等待将会丢失部分并行性。现在的非阻塞并发算法、可持久化的数据结构等都可以在一定程度上解决部分问题,但并不理想。
②无状态的工作者。共享状态能够被系统中得其他线程修改。所以工作者在每次需要的时候必须重读状态,以确保每次都能访问到最新的副本,不管共享状态是保存在内存中的还是在外部数据库中。工作者无法在内部保存这个状态(但是每次需要的时候可以重读)称为无状态的。每次都重读需要的数据,将会导致速度变慢,特别是状态保存在外部数据库中的时候。
③任务顺序不确定。 另一个缺点就是作业执行顺序不确定。无法保证哪个作业最先或者最后被执行。
类似工厂生产线上工人一般,每个工作者只负责作业中的部分工作,当完成了自己这部分工作时就会把作业转发给下一个工作者,每个工作者都只在自己的线程中运行,并不会和其他工作者共享状态。
实际应用中可能的情况:
多个不同的虚拟流水线同时运行 作业被转发到超过一个工作者上并发处理
采用流水线并发模型的系统有时候也称为反应器系统或事件驱动系统。系统内的工作者对系统内出现的事件做出反应,这些事件也有可能来自于外部世界或者发自其他工作者。事件可以是传入的HTTP请求,也可以是某个文件成功加载到内存中等。
比较流行的反应器/事件驱动平台:
Actors 和 channels 是两种比较类似的流水线(或反应器/事件驱动)模型。
在Actor模型中每个工作者被称为actor。Actor之间可以直接异步地发送和处理消息。Actor可以被用来实现一个或多个像前文描述的那样的作业处理流水线。
而在Channel模型中,工作者之间不直接进行通信。相反,它们在不同的通道中发布自己的消息(事件)。其他工作者们可以在这些通道上监听消息,发送者无需知道谁在监听。
优点:
①无需共享的状态。这意味着实现的时候无需考虑所有因并发访问共享对象而实现的并发性问题。在实现工作者时就好像单线程在处理工作。
②有状态的工作者。当工作者知道了没有其他线程可以修改它们的数据,工作者可以变成有状态的。对于有状态,我是指,它们可以在内存中保存它们需要操作的数据,只需在最后将更改写回到外部存储系统。因此,有状态的工作者通常比无状态的工作者具有更高的性能。
③较好的硬件整合。单线程代码在整合底层硬件时具有更好的优势。原因有二:第一,单线程代码通常能创建更优化的数据结构和算法。第二,单线程有状态的工作和能够在内存中缓存数据。也就意味着很有可能也缓存在执行这个线程的CPU的缓存中,这使得访问缓存的数据变得更快。
④合理的作业顺序。基于流水线并发模型实现的并发系统,在某种程度上是有可能保证作业的顺序的。这样就更容易推出系统某个特定时间点的状态,更进一步,你可以将所有到达的作业写入日志中。一旦系统某部分出现问题,该日志就可以用来重建系统。
缺点:流水线并发模型最大的缺点是作业的执行往往分布到多个工作者上,并因此分布到项目中的多个类上。这样导致在追踪某个作业到底被什么代码执行时变得困难。同样,这也加大了代码编写的难度。有时会将工作者的代码写成回调处理的形式。若在代码中嵌入过多的回调处理,往往会出现所谓的回调地狱(callback hell)现象。
函数式并行的基本思想是采用函数调用实现程序。函数可以看作是”代理人(agents)“或者”actor“,函数之间可以像流水线模型(AKA 反应器或者事件驱动系统)那样互相发送消息。某个函数调用另一个函数,这个过程类似于消息发送。
函数都是通过拷贝来传递参数的,所以除了接收函数外没有实体可以操作数据。这对于避免共享数据的竞态来说是很有必要的。同样也使得函数的执行类似于原子操作。每个函数调用的执行独立于任何其他函数的调用。
一旦每个函数调用都可以独立的执行,它们就可以分散在不同的CPU上执行了。这也就意味着能够在多处理器上并行的执行使用函数式实现的算法。
文章浏览阅读8.7k次,点赞5次,收藏4次。Matlab R2014a使用mcc编译lib文件时出错,Error: Could not check out a Compiler license: SIGN= keyword required but missing from the license certificate. This is probably because the license is older than _2014a mcc license
文章浏览阅读1.1k次。我也是醉了,在各种环境下对PBRT-V3进行了编译和调试。 参考:Q113:PBRT-V3分别在Linux和Mac下的编译与调试(汇总)不过,小编对CodeBlocks“情有独钟”,所以,必须在CodeBlocks下完成这个事情。(注意是Linux系统)一、用cmake生成CodeBlocks的工程文件二、编译三、调试_添加 pbrt vs
文章浏览阅读3.4k次。碰到很多人问Linux版本的Qt怎么不能输入中文。今天解答一下,在我们的ubuntu系统一般大家都是安装的搜狗输入法。而搜狗输入法只能在浏览器或者其他地方能输入中文。在Qtcreator中无法输入中文。解决的方法就是安装其他输入法。以下是具体操作首先看是否已添加中文输入,点你的设置图标进入设置菜单中的语言支持进入语言支持看你的是否已经有汉语(中国),没有则选择下面的添加或删除语言选项,添加汉语简体。然后点击应用到整个系统。接下来Ctrl+Alt+T 调出 Terminal.._qt里怎么弄不出拼音
文章浏览阅读587次。首先解释一下cli_opt_t的这个_t代表结构体可能是type的意思。同时还有很多i_ b_等作为前缀的变量,其中的i_表示int类型的变量,b_表示bool类型的。依次类推。正式进入主题。(A)typedef struct { int b_progress; int i_seek; hnd_t hin; hnd_t hout; FILE_param->rc.f_vbv_buffer_init
文章浏览阅读2.3k次。org.apache.ibatis.exceptions.PersistenceException:### Error querying database. Cause: java.util.ConcurrentModificationException### The error may exist in com/mybatis/mapper/UserMapper.xml### The ..._error querying database. cause: java.util.concurrentmodificationexception
文章浏览阅读450次。本文转自CSDN:https://blog.csdn.net/deiki/article/details/73252942,因为我在为树莓派安装2.4G无线键鼠的时候,鼠标反应很慢,卡顿严重(换成有线鼠标就好了,而且这个无线鼠标在win10上面是正常的),最终按着这位兄弟的办法,解决了,为了记住这个解决方法,特此转到我的博客。 之前在树莓派上试了几款鼠标..._树莓派2.4g鼠标速度如何调节
文章浏览阅读7.3k次。第一. 要向android项目libs文件夹里添加gson-2.2.2.jar文件。 Txt文件中的json字符串:[{"ID":1,"LineColor":-16776961,"FillColor":-16776961,"LineSpan":10,"LineWidth":1,"Display":true,"Selected":true}, {"ID":2,"LineColor_android12 sdcard文件中的字符串
文章浏览阅读629次。唉 ,好久没有写博客了,今天弄一个简单的工具类脚本吧,在我们开发中经常会出现频繁打包测试的功能,对于不懂Unity的一些测试和策划人员来说,他们不会啊,老是麻烦程序也不太好对吧,干脆直接来个工具吧,傻瓜式打包APP吧!哈哈哈~直接上代码~/**************************************************** 文件:BuildApp.cs 作者:LYZY..._一键打包app工具
文章浏览阅读296次。什么是二叉平衡树,如何插入节点,删除节点,说出关键步骤。_什么是二叉平衡树,如何插入节点,删除节点,说出关键步骤。
文章浏览阅读1.9k次。超文本标记语言(HyperText MarkUp Language,HTML)HTML是用来制作网页的标记语言,HTML不需要编译,直接由浏览器解析;HTML文件是一个文本文件,包含了一些HTML元素, 标签等;HTML文件必须使用html或htm为文件名后缀;HTML是大小写不敏感的,HTML与html是一样的。HTML超文本标记语言,通过使用标记来描述文档结构和表现形式的一种语言,由浏览器进行..._java超文本标记语言转义
文章浏览阅读975次。说明LNK1104: 无法打开文件“uiAccess='false' /MANIFESTDEPENDENCY:ty 对于此类型问题现实可能各种原因导致,我目前提供的并不能解决每一位所产生的问题,勿怪。平台:vs2015 - qt5.7.1将通过 qmake -tp vc xxx.pro 产生xxx.vcxproj 通过vs2019打开 并选择对应的工具集编译时,出现LNK1104: 无法打开文件“uiAccess=‘false’ /MANIFESTDEPENDENCY:ty解决方案打开_无法打开文件“uiaccess='false
文章浏览阅读869次。大家装SODBASE CEP Server的时候会发现,它本身就是一个分布式系统,可以非常方便的快速建立分布式运算模型。1. 启用集群方法只要修改sodbase-cep-server-webservice-1.0.1/configuration/configuration/db.properties即可。所有的计算服务器共享了一个状态服务器State Server,也就是db.proper_哪个分布式计算框架支持cep操作