1.Overview在没有必要的同步的情况下,编译器,运行时或处理器可能会应用各种优化。尽管这些优化在大多数情况下是有益的,但有时它们可能会引起一些细微的问题。
缓存和重新排序是在并发上下文中可能使我们感到惊讶的优化措施之一。Java和JVM提供了许多方法来控制内存顺序,而 volatile 关键字就是其中一种。
在本文中,我们将重点介绍Java语言中这个基本但经常被误解的概念-volatile关键字。首先,我们将从底层计算机体系结构的工作背景入手,然后再熟悉Java中的内存顺序。
2.共享多处理器架构处理器负责执行程序指令。因此,他们需要从RAM中检索程序指令和所需的数据。
由于CPU每秒能够执行大量指令,因此从RAM中获取数据并不是理想的选择。为了改善这种情况,处理器使用了一些技巧,例如乱序执行,分支预测,推测执行,当然还有缓存。
这是以下内存层次结构起作用的地方:
当不同的内核执行更多的指令并处理更多的数据时,它们会用更多相关的数据和指令填充其缓存。这将以提高缓存一致性挑战为代价提高整体性能。
简而言之,我们应该三思而后行一个线程更新缓存的值时会发生什么。
3.When t ...
1.Overview在本文中,我们将研究java.util.concurrent包中的两个构造:LongAdder和LongAccumulator。
两者都被创建为在多线程环境中非常高效,并且都利用非常巧妙的策略来实现无锁且仍保持线程安全。
LongAdder让我们考虑一些逻辑,该逻辑经常增加一些值,而使用AtomicLong可能会成为瓶颈。这使用了比较交换操作,在激烈的竞争中,这可能会导致大量的CPU周期浪费。
另一方面,LongAdder使用非常巧妙的技巧来减少线程之间的争用(当线程递增时)。
当我们想增加LongAdder的实例时,我们需要调用 increment() method。该实现保留了可以按需增长的一系列计数器。
因此,当更多线程正在调用 increment()时,数组将更长。数组中的每个记录都可以单独更新-减少了争用。因此,LongAdder是从多个线程递增计数器的非常有效的方法。
让我们创建LongAdder类的实例,并从多个线程中对其进行更新:
12345678910111213LongAdder counter = new LongAdder();Execu ...
markdown
未读OverviewThe basic syntax outlined in John Gruber’s original design document added many of the elements needed on a day-to-day basis, but it wasn’t enough for some people. That’s where extended syntax comes in.
Several individuals and organizations took it upon themselves to extend the basic syntax by adding additional elements like tables, code blocks, syntax highlighting, URL auto-linking, and footnotes. These elements can be enabled by using a lightweight markup language that builds upon the b ...
spring
未读1.Overview在本文中,我们将讨论如何在Spring中使用事件。
Events件是框架中最容易被忽略的功能之一,但也是更有用的功能之一。而且,与Spring中的许多其他事情一样,Spring – event发布是ApplicationContext提供的功能之一。
有一些简单的准则可以遵循:
该事件应扩展ApplicationEvent
发布者应该注入一个ApplicationEventPublisher对象
侦听器应实现ApplicationListener接口
2.自定义事件(A Custom Event)Spring允许创建和发布自定义事件,这些事件默认情况下是同步的。这具有一些优点-例如,侦听器能够参与发布者的交易环境。
2.1。一个简单的应用程序事件让我们创建一个简单的事件类 –只是一个占位符来存储事件数据。在这种情况下,事件类包含String消息:
1234567891011public class CustomSpringEvent extends ApplicationEvent { private String message; pu ...
并发是指多个任务,这些任务在重叠的时间段内以无特定顺序启动,运行和完成。并行是指多个任务或唯一任务的多个部分实际上在同一时间(例如在多核处理器上)运行。请记住,并发和并行性不是一回事。
让我们更详细地了解当我说“ 并发与并行”时的意思。
Concurrency当我们谈论至少两个或更多任务时,并发本质上是适用的。当一个应用程序实际上可以同时执行两个任务时,我们将其称为并发应用程序。尽管这里的任务看起来像是同时运行的,但实际上它们可能不一样。它们利用操作系统的CPU时间分片功能,其中每个任务运行其任务的一部分,然后进入等待状态。当第一个任务处于等待状态时,CPU被分配给第二个任务以完成它的一部分任务。
因此,操作系统根据任务的优先级分配CPU和其他计算资源,例如内存;依次处理所有任务,并给他们完成任务的机会。对于最终用户,似乎所有任务都是并行运行的。这称为并发。
Parallelism并行不需要两个任务存在。通过使用CPU的多核基础结构,通过为每个任务或子任务分配一个内核,它实际上可以同时运行部分任务或多个任务。
并行性本质上要求具有多个处理单元的硬件。在单核CPU中,您可能会获得并发性, ...
打卡古北水镇2019-06-12 00:00:00打卡古北水镇
一、行程预订提前2天在携程预订龙行天下的团队票。
二、出发与路途2019年10月4号9:10东四十条地铁C口出来就看到了候车的人群,随后根据手机短信提示的导游信息找到了随行导游。9:40在芍药居接上其他游客后,开始前往景区。路上导游说现在谁都不能保证到达古北的准确时间,昨天下午3点才到达景区,但与前两天相比已经提前1个半小时了,希望这次还会比昨天提前。然后导游开始了长达1个半小时的景区介绍,提到古北自有“北方之雄南方之秀”之称,游览有三条道可供选择:电瓶车道、青石板路、乌蓬船的水路,还有一些必须游览的地方及小吃,最后就是销售景区门票。导游的销售套路是在介绍景区风景时,重点介绍需购票的景点和娱乐设施勾起游客兴趣,再强调有些景点是此行必选,不选就虚了此行。大巴上不少游客二次消费购买了相应项目票,而作者不为所动,一是时间紧,若把所有项目凑在1日游日程中,会有些景点不能细致观赏;二是不想太累,前两天做蹲起导致大腿酸软;三是不想产生额外费用。
三、抵达景区下午1:20顺利抵达目的地。导游先带大家进入景区内部,20分钟上洗手间,导游去 ...
2018年9月20
家住南5环,7:30出门,1个小时后到达望京南D口出,和好友碰头,打算找866公交车前往怀柔汽车站。但是看到866终点站牌,我们像没头苍蝇似的在地铁口徘徊好久,愣是没找到始发站,问了路人才发现在终点站对过的车场里头排队上车。866发车倒是很快,大概50分钟的样子到达怀柔汽车站,我们在车上发现有两位同是去红螺寺的老人,以防再找不到H57路车就跟着他们一起走到的站牌赶上了10:00发车的H57,在20分钟后抵达终点。由于是工作日的关系,景点的游客不是很多,都不用排队买票。我们发现游红螺寺的大多都是上岁数的老年人,从买票到进门就看见一对小情侣。红螺寺不是求姻缘挺灵验的地方吗,反而老年人比较多,不太明白是什么梗。可能现在的年轻人对于烧香拜佛类的事情嗤之以鼻吧,长者还是比较信奉的吧。进入大门后就是红螺寺赐福的大鼎,当然拍照留念。往里走,路两侧都是竹子,空气闻上去很清新。我们穿过竹林就来到了古式的建筑区,有一个小池塘里面密密麻麻的乌龟像是假的。我们顺着小路一直走到了青龙山的入口,顺着蜿蜒的小山路一直走上去,不一会就看到了一条大青龙的雕塑,同是属大龙的我们当然要和雕塑合影。这一路 ...
本文出自澳大利亚一位ID为Dodgy Coder的程序员2012年4月的博客文章。他从High Scalability上整理和总结了Google、YouTube、Twitter、Amazon、Ebay、Facebook和Instagram等7家知名互联网的系统扩展经验。值得注意的是,有些资料时过境迁,已经不再反映最新情况,但是核心的理念和许多具体经验还是非常宝贵的学习资料,值得一读。****
不难发现,这7个公司都有以下共同的6大理念:
保持简单——随着时间推移,复杂性会自然出现。
自动化一切——包括灾难恢复。
不断迭代——想扩展到更高水平?必须准备好忍痛弃用现在能工作的某个组件。
选择合适的工具——但也不怕自己动手打造。
使用缓存——在适当的地方。
根据场景,在数据的一致性和可用性之间做取舍。
下面来分别看一下7大公司的经验吧。
一、 Google
可靠的存储(Reliable Storage)
可靠、可扩展的存储基本上是任何应用程序的核心。GFS(Google File System)是Google的核心存储平台——它是一个大型分布式结构化的日志文件系统,Google在其中 ...
生活&旅游
未读2019 6.1 早上5点出发至天津机场。富余出两个小时,天津机场的儿童设施相当给力,解决了小朋友的无聊时间。小满同学3岁第一次飞,最喜欢的就是座椅前的屏幕,一直在研究,搞定后开始选自己喜欢的动画片。大约是在飞机减速时小满同学出现耳鸣现象开始哭闹,邻座的叔叔估计觉得小满的哭声太吵,找到空乘询问是否有糖可以给小朋友。没想到真的有用哦,小满在得到来自漂亮空姐的口香糖后,神奇的不哭了。还算顺利结束了3个多小时的飞行。
打车到贝壳酒店大概40分钟左右,酒店位于双子塔旁边叫做沙坡尾的区域,地理位置还不错,只是环境不是很好,能闻出潮湿的味道,也许厦门本来就比较潮湿,进门后放下行李后,我们就开始沿着周边闲逛。出来就看到卖当地特产的店铺,瞬间感应到我们住在了游客区。沿着小道一直走到了名为“吃堡”的建筑,还有活动在举行,可能不是旅游打卡的地方,人不是很多,里面的商铺感觉是惨淡经营,因为没啥经验,就从一层开始吃起,什么沙茶面、竹笋冻,酱油冰淇淋,海鲜炒饭,芒果汁,还有海鲜类小吃等,选了一些比较没听说过的,尝试了一下,但就是价格偏贵,生蚝别的地方都是10块钱 ...
在过去的一年中,我一直在数学的海洋中游荡,research进展不多,对于数学世界的阅历算是有了一些长进。
为什么要深入数学的世界作为计算机的学生,我没有任何企图要成为一个数学家。我学习数学的目的,是要想爬上巨人的肩膀,希望站在更高的高度,能把我自己研究的东西看得更深广一些。说起来,我在刚来这个学校的时候,并没有预料到我将会有一个深入数学的旅程。我的导师最初希望我去做的题目,是对appearance和motion建立一个unified的model。这个题目在当今Computer Vision中百花齐放的世界中并没有任何特别的地方。事实上,使用各种Graphical Model把各种东西联合在一起framework,在近年的论文中并不少见。
我不否认现在广泛流行的Graphical Model是对复杂现象建模的有力工具,但是,我认为它不是panacea,并不能取代对于所研究的问题的深入的钻研。如果统计学习包治百病,那么很多“下游”的学科也就没有存在的必要了。事实上,开始的时候,我也是和Vision中很多人一样,想着去做一个Graphical Model——我的导师指出,这样的做法只是重复一 ...



