Java-并发编程——CyclicBarrier
一、简介
CyclicBarrier 是一个同步工具类,它允许一组线程在到达某个栅栏点(common barrier point)互相等待,发生阻塞,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行.它非常适用于一组线程之间必需经常互相等待的情况。CyclicBarrier 字面理解是循环的栅栏,之所以称之为循环的是因为在等待线程释放后,该栅栏还可以复用。
建议阅读 CyclicBarrier 源码前,先深入研究一下 ReentrantLock 的原理,搞清楚 Condition 里 await 和 signal 的原理。
二、应用场景
使用 CyclicBarrier 来模拟一下对战平台中玩家需要完全准备好了才能进入游戏的场景,例如 LOL 的加载过程。
1234567891011121314151617181920212223242526public class CyclicBarrierTest { private final static ExecutorService EXECUTOR_SERVICE = Executors.ne ...
Java 并发编程——LinkedBlockingQueue
在集合框架里,ArrayList 和 LinkedList 是使用最多的两种集合。ArrayList 和 ArrayBlockingQueue 一样,内部基于数组来存放元素,而 LinkedBlockingQueue 则和 LinkedList 一样,内部基于链表来存放元素。
LinkedBlockingQueue 实现了 BlockingQueue 接口,不同于 ArrayBlockingQueue,它如果不指定容量,容量默认为 Integer.MAX_VALUE,也就是无界队列。
一、源码分析
1.1 属性
12345678910111213141516171819202122232425262728293031323334353637/** * 节点类,用于存储数据 */static class Node<E> { E item; Node<E> next; Node(E x) { item = x; }}/** 阻塞队列的大小,默认为Integer.MAX_VALUE */private f ...
Java 并发编程——ArrayBlockingQueue
一、简介
ArrayBlockingQueue 顾名思义:基于数组的阻塞队列。数组是要指定长度的,所以使用 ArrayBlockingQueue 时必须指定长度,也就是它是一个有界队列。它实现了 BlockingQueue 接口,有着队列、集合以及阻塞队列的所有方法。
ArrayBlockingQueue 是线程安全的,内部使用 ReentrantLock 来保证。ArrayBlockingQueue 支持对生产者线程和消费者线程进行公平的调度。当然默认情况下是不保证公平性的,因为公平性通常会降低吞吐量,但是可以减少可变性和避免线程饥饿问题。
二、数据结构
通常,队列的实现方式有数组和链表两种方式。对于数组这种实现方式来说,我们可以通过维护一个队尾指针,使得在入队的时候可以在 O(1)O(1)O(1) 的时间内完成;但是对于出队操作,在删除队头元素之后,必须将数组中的所有元素都往前移动一个位置,这个操作的复杂度达到了 O(n)O(n)O(n),效果并不是很好。如下图所示:
为了解决这个问题,我们可以使用另外一种逻辑结构来处理数组中各个位置之间的关系。假设现在我们有一个数组 A[ ...
Gitmoji 速查指南
在日常使用 Git 提交过程中,是否觉得提交记录太过单调了呢,如果你也有这种想法,那么就赶紧 Get 下 Gitmoji 吧。
Emoji 在日常生活中是不是经常使用呢,Gitmoji 就是 Git 领域的 Emoji。下图就是使用效果。
Gitmoji 的使用十分简单,只要在 Commit 记录的开头填上对于表情的代码即可,如下图所示。
下面列出所有的 Gitmoji 表情代码,以及它们的用法。
官方 GitHub 地址: Gitmoji Repo
Gitmoji
代码
说明
🎨 (调色板)
:art:
改进代码结构/代码格式
⚡️ (闪电)
:zap:
提升性能
🔥 (火焰)
:fire:
移除代码或文件
🐛 (bug)
:bug:
修复 bug
🚑 (急救车)
:ambulance:
重要补丁
✨ (火花)
:sparkles:
引入新功能
📝 (备忘录)
:memo:
撰写文档
🚀 (火箭)
:rocket:
部署功能
💄 (口红)
:lipstick:
更新 UI 和样式文件
🎉 (庆祝)
:tada: ...
白话比特币与区块链
都 9102 年了,连大大都发话要大力发展区块链技术,还不来赶紧了解下区块链知识吗。本篇文章主要是科普向,建立对比特币和区块链的基本认知。
一、比特币诞生
2008 年在世界金融危机的大背景下,有一个化名为中本聪的极客,在互联网上发表了一篇名为《Bitcoin: A Peer-to-Peer Electronic Cash System》 的文章。他在这篇文章中提出了设计一种去中心化的电子记账系统的设想。
我们知道,在当今时代,进行支付最重要的一件事情就是记账。所谓记账,就是要有人记录你的账本的资金变动,例如使用银行卡支付,实际是由银行进行记账。银行的背后是中央政府,代表的是国家的信用,我们都信任他,这里的银行就是一个中心化的电子记账系统。
**如果这个节点出现了问题,那么我们的资金安全就受到了威胁。**还记得前几天微信支付直接崩掉了,有用户就反馈说付款后商家没有收到,而余额已经扣除的问题。
中本聪提出的观点就是,我们其实并不需要这个中心化的节点,我们可以去中心化,每一个人的账本都是公开,可被他人查阅的,这就是去中心化的电子记账系统。
举个例子来说,假设存在用户 A、B、C,他们之 ...
理解蓝绿发布、灰度发布和滚动发布
目前绝大多数公司的业务系统都是集群化部署,那么在新版本上线时,保证平滑稳定,尽量减少对线上用户的影响,就显得尤为重要。毕竟谁也不想看到,版本一发布,系统就宕机吧。
随着互联网技术的发展,目前业务发布已经基本形成蓝绿发布、灰度(金丝雀)发布、和滚动发布这三种发布策略。
一、蓝绿发布
扩展阅读:BlueGreenDeployment——Martin Fowler
蓝绿部署是一种以可预测的方式发布应用的技术,目的是减少发布过程中服务停止的时间。
简单来说,我们把整个服务集群分成两组(或更多组,为了显示蓝/绿,分为两组),一组认为是绿色,另一组认为是蓝色,此时通过 LB LIVE 都能够为用户提供服务。
准备另一个备用的 LB,称其为 LB STANDBY,将绿色的集群交由它处理,此时绿色集群已经无法处理用户请求。
此时将绿色集群进行版本升级,将服务由 V1 升级至 V2。
绿色集群完成版本升级后,通过人工测试、自动化测试的方式测试 V2 服务的稳定性。当测试完毕无误后,将绿色集群交回 LB Live 处理,此时绿色集群开始处理用户实际请求。
此时先不要急于将蓝色集群进行升级,应 ...
深度解读央行数字货币 DCEP
继上篇谈了下自己对 DCEP 的看法后,再分享一篇 DCEP 的文章,希望能够帮助大家更加了解 DCEP。
自从区块链技术被国家队提名以来,刷屏之势有如泄洪。各大行业企业纷纷响应号召,喊着“推动区块链技术和产业创新”的口号开始撸起袖子加油干。而与区块链紧密相关的就是“数字货币”概念,在时代大趋势的推动下,近几年全球许多国家都在筹备着研究和发行自己的央行数字货币,中国人民银行也不例外,甚至已经走在了世界的前沿。
此前原中国人民银行支付结算司副司长、现中国人民银行数字货币研究所所长穆长春表示,央行数字货币的研究已进行五年,现在呼之欲出。一方面,这确实是一个浩大的工程,另一方面,央行可能也是在观望中探索。但就在 Facebook 计划推出 Libra 项目及其数字货币之后,央行数字货币的研发似乎就进入了加速通道。
相信大家还记得10月23日晚上扎克伯格在听证会上表示,Libra 旨在成为全球支付系统,为了让监管机构松口他甚至还设立假想敌,将矛头指向中国央行数字货币:“我们需要讨论不创新的风险,尤其需要考虑中国央行数字货币……如果中国的金融系统成为越来越多国家的标准,那未来美国很难实施制 ...
浅谈央行数字货币 DCEP
一、前言
距上篇文章更新已经有一月有余了,在这一个月时间内,一是公司事情比较多,一直在加班。二是也有点犯懒了,文章更新频率下降了。正逢最近区块链风头正热,造就了这篇文章的诞生。
上周五(2019.10.25)晚新闻联播中,播报了主席对区块链技术的讲话。当晚,BTC 一转数周的颓势,从 7300$ 直接疯涨至 10500$。网上甚至有人说这是当代中本聪,哈哈。
当然,比特币只是区块链技术一个非常小的应用,比特币绝不是区块链技术的最终落地。因此主席的这番讲话,使得比特币的涨动,也只是纯粹的投机行为。投资比特币的观望者,仍需谨慎入场。
与区块链相关的概念股也迎来一波暴涨,迅雷股价直接翻番。但是还是那句话,投资需谨慎,目前区块链技术仍然较为前沿,未来发展仍然有待观察。
二、传统数字货币
说道数字货币,就不得不提比特币(BTC)。比特币从 2009 年诞生之初,从最初的一毛不值,到 2017 峰值的 20000$,期间起起伏伏,创造了无数的暴富神话。
比特币本身是去中心化的、数量有限的、无主权的,其价格完全由市场操控。但是随着比特币的火爆,市面上涌现出一大批山寨币,发行方要么收割一波韭菜 ...
性能监控指标
一、TP 与百分位数
1.1 TP 指标
在对系统进行性能测试或性能监控时候,TP 指标是一种比较常见的性能参数,包括 TP50、TP99、TP999 等等。
总次数 * 指标数 = 对应指标在总次数中的序号
通俗点说,假设为了测试某接口性能,对其调用 100 次,将每次的响应时间升序排序,假设响应时间排序结果为:1、2、3…99、100 毫秒。
那么:
TP50 = 100 * 50% = 第50次 = 50毫秒
也就是说,该接口 TP50 达到了 50 毫秒的水平,也就是说请求该接口有 50% 的情况耗时在 50 毫秒以下。
同理:
TP999 = 100 * 99.9% = 第99.9次 ≈ 100毫秒
也就是说,该接口 TP999 达到了 100 毫秒的水平,也就是说请求该接口有 99.9% 的情况耗时在 100 毫秒以下。
需要注意的是,一般在 TP 指标中,如果对应的序号不是整数,一般向上取整。例如在上例的 TP999 中,序号 99.9 不存在,取了序号 100 来计算。
1.2 百分位数
TP 指标脱离了在计算机中的应用,实际上在统计学学中就是百分位数 ...
理解 DRY、KISS、YAGNI 三原则
在软件的设计当中前人已经总结了许多的设计原则和设计模式。例如 SOLID,GRASP 设计原则,这些原则都是基于面向对象设计总结而来的。而 GOF23 是基于许多常见的场景总结出了一套设计模式,在我们遇到类似的场景,都可以套用设计模式。
而今天所讲到的软件三原则是适用于在软件设计的各个层面的。它不仅适用于面向对象的设计,也适用于面向过程的程序设计;不仅适用于类的设计,也适用于模块、子系统的设计。就连在项目架构运维部署中也适用于这一套简单的法则。
DRY - Don’t Repeat Yourself
A basic strategy for reducing complexity to managable units is to divide a system into pieces.
第一条准则是不要总是用相同代码解决相同问题。尽量在项目中减少重复的代码行,重复的方法,重复的模块。
其实许多设计原则和模式最本质的思想都是在消除重复。我们经常提起的重用性和可维护性其实是基于减少重复这一简单的思想。为什么现在微服务盛行呢?正是因为将系统中的服务进行抽取的话,便减少了重复。重复冗余 ...