
暂无个人介绍
能力说明:
了解变量作用域、Java类的结构,能够创建带main方法可执行的java应用,从命令行运行java程序;能够使用Java基本数据类型、运算符和控制结构、数组、循环结构书写和运行简单的Java程序。
暂时未有相关云产品技术能力~
阿里云技能认证
详细说明礼品区1:参与万人开发,赢天猫精灵、高达模型、AirPods...... >>点击这里<< 前往Hands-on Labs活动专区! 奖品赢取流程:进入Hands-on Labs活动页,完成签到、提交Hello World代码后,你就能获得一个专属你的全球唯一序列号证书。完成这 3 步任务,只要您的完成顺序是 3 的倍数,即可获得 Apsara 官方 T 恤一件(每人限领一次)! 参加活动,加入钉钉群,每天18:00还会在群中抽取幸运程序员锦鲤1名,AirPods、高达PG模型、Cherry机械键盘等丰富大礼抱回家! Hands-on Labs还不止这些惊喜!完成8项打卡任务,还可获得价值10元的猫眼电影抵扣券(数量有限,先到先得)。 更有5大必玩实验室,参与Hands-on Labs实验室活动,5大奖区等你来拿: 奖区1:4000件Apsara官方T恤 来查收你的第一个线上博客,总量4000个Apsara定制T恤免费放送!每日限量,10点上新。提前完成任务,次日10点直接领取更方便。 奖区2:2000个免费顶级域名 从设计稿到AI应用,体验开发界的“神笔码良”!总量2000件免费顶级域名免费拿,活动开始后每天下午14点会进行补仓,记得直接来页面领取奖品哦~ 奖区3:价值20000元的DSW探索者版体验机会 截止9月18日,动手体验"数据科学",你只需完成"一见钟情"配对指数小游戏并查看原理,即可领取阿里云机器学习PAI-DSW团队为你带来的三大礼包——包含价值20000元的DSW探索者版体验机会和独家定制T恤! 奖区4:1000个intelliJ联名悠悠球 体验Java工程脚手架搭建工程&分享,完成微服务沙箱体验并通过答题,即可赢取联名悠悠球一个!总量1000个,每日限量,10点上新。提前完成任务,次日10点直接领取更方便! 奖区5:1000个云上实验室免费体验名额 最强CPU大脑,平头哥邀请全球1000个开发者内测云上实验室!1000个限量体验名额,点击标题立刻免费申请吧! 礼品区2:小孩子才做选择,大厂Offer和限量周边我都要! >>点击这里<< 前往Offer 5000活动专区! 奖品赢取流程:9月18日前,完成Offer 5000活动页面的5项任务,即可领取阿里云纪念勋章一套以及价值600元的阿里云ACA考试资格一份,限量700份! 好戏还在后头!截止9月18日,点击标题前往活动页,你还有机会获得本次云栖大会“Offer 来啦”活动推出的特别用户权益——火箭面试卡(限量100张哦)!获得火箭面试卡的用户将会在9月18日前收到投递企业的联络,直接进入面试流程并最快当天获得录用意向! >>点击这里<< 马上了解“火箭面试卡”吧! 还有超全阿里云+生态企业岗位直聘,赶快投递你的简历吧!快点击链接前往Offer 5000活动专区吧!—— https://yunqi.aliyun.com/2020/offers 礼品区3:参与云栖训练营,赢阿里总部参观机会,机票酒店全免! >>点击这里<< 前往云栖训练营活动专区! 奖品赢取流程:本届云栖训练营分两波开启,目前第一波训练营正在火热报名中,点击上面的链接快去报名吧!加入训练营后,在指定时间内完成训练营页面的学习任务,丰富好礼等你拿! 热营先开,礼品先知!快点击训练营标题抢先参与吧! 阿里橙长之旅——宜搭低代码开发训练营 来回机票+菲住布渴智能酒店+阿里巴巴总部参观+阿里大咖面对面交流......你没看错!即日起报名参加宜搭低代码开发训练营,上面的“阿里橙长之旅”套餐都是你的!还有价值600元的阿里云低代码专业技能证书、宜搭定制帆布袋等你来拿! CNCF指尖陀螺——云原生开发者训练营 前往训练营页面,通过3天学习打卡+开通底部产品,一站式带你学透K8S,完成任务即可在页面领取限量CNCF指尖陀螺一枚! SLS联名限量T恤——DevOps日志分析训练营 9月14日起,在授课日当天完成钉群学习并在本页面完成打卡,结营时完成6天连续打满无空缺,即可获得ACA免费考试资格与SLS联名限量T恤! 阿里云定制纪念马克杯——小程序云开发训练营 9月14日起,在授课日当天完成钉群学习并在本页面完成打卡,结营时完成4天连续打满无空缺,参与结营作业评审,优秀学员有机会获得阿里云定制纪念马克杯1只! 限量版蚂蚁贴纸——mPaaS小程序训练营 9月14日起,在授课日当天完成钉群学习并在本页面完成打卡,结营时完成4天连续打满无空缺,即可获得限量版蚂蚁贴纸1件! 阿里云飞天代码定制T恤——云开发Web应用训练营 从入门到精通快速上手Serverless和云开发技术,无需保有服务器,轻松开发并上线自己的个人博客、小程序、管理系统!连续7天打卡,阿里云飞天代码T-shirt拿回家! 礼品区4:开发者的排位赛!限时“上分”赢定制T恤 >>点击这里<< 前往在线编程抢答赛活动专区! 奖品赢取流程:9月18日当天,参与早、中、晚任意一场云栖在线编程限时抢答赛,在比赛规定时间内完成答题,每场答题赛TOP100的选手可获得定制T恤1件。TOP101-200的选手可获得SuperCoder勋章1枚! 排行榜采用ACM赛制,提交用时+罚时为总用时,注意,非比赛时间可参与答题学习将不计入排行哦!最强王者还是嘴强王者,让代码替你说话吧! 快点击链接前往在线编程抢答赛活动专区吧!—— https://yunqi.aliyun.com/2020/games 以上就是本次云栖开发者的全部礼品啦!更多礼品陆续上线中,本文也将实时更新,为大家带来更多开发者奖品攻略!转评收藏不迷路哦!
距离泰山版《Java开发手册》发行已经有一段时间了,你是否已经下载了这本超人气电子书呢?为了帮助广大开发者更好地学习和使用《Java开发手册》,阿里妹特地为你整理了所有版本的Java手册和超多学习资料,供你对比和学习使用!废话不多说,直接“上菜”吧! 泰山版Java手册 免费下载(点击图片): 或者复制下面链接到浏览器即可获取下载链接:https://developer.aliyun.com/topic/java2020 历代《Java开发手册》汇总 《Java开发手册》始于阿里内部规约,在全球Java开发者共同努力下,已成为业界普遍遵循的开发规范。手册涵盖编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程规约、设计规约七大维度。 2016年12月07日:1.0.0公开版——首次向业界公开! 点击链接或复制到浏览器获取1.0.0版本:https://developer.aliyun.com/topic/download?id=4 2017年02月27日:1.1.0正式版 更新亮点:增加前言和专有名词说明,修正部分描述 点击链接或复制到浏览器获取1.1.0版本:https://developer.aliyun.com/topic/download?id=5 2017年05月20日:1.2.0升级版 更新亮点:开始向外界公开征集意见后的修改版本 点击链接或复制到浏览器获取1.2.0版本:https://developer.aliyun.com/topic/download?id=7 2017年09月19日:1.3.0终极版 更新亮点:增加单元测试规约 点击链接或复制到浏览器获取1.3.0版本:https://developer.aliyun.com/topic/download?id=8 2018年06月06日:1.4.0详尽版 更新亮点:新增16条设计规约 点击链接或复制到浏览器获取1.4.0版本:https://developer.aliyun.com/topic/download?id=9 2019年06月13日:华山版 更新亮点:新增21条设计规约,修改描述112处 点击链接或复制到浏览器获取华山版:https://developer.aliyun.com/topic/download?id=10 2020年04月22日:泰山版 更新亮点:新增5条日期时间规约;新增2条表别名sql规约;新增统一错误码规约 点击链接或复制到浏览器获取泰山版:https://developer.aliyun.com/topic/download?id=12 学Java,技术大牛来辅导! 阿里 JVM 团队技术专家郁磊:拼不过 GO?阿里如何重塑云上的 Java Java 诞生于20年前,拥有大量优秀的企业级框架,践行 OOP 理念,更多体现的是严谨以及在长时间运行条件下的稳定性和高性能。反观如今,在要求快速迭代交付的云场景下,语言的简单性似乎成了首要的要求,而传统的 Java 语言显得有一些过于重量了。 点击或复制链接查看详情:https://developer.aliyun.com/article/738762 阿里巴巴地图技术专家常意:初创公司5大Java服务困局,阿里工程师如何打破? 初创公司遇到的每一个问题都可能攸关生死。创业之初更应该总结行业的常见问题,对比方案寻找最优解。借鉴在技术圈摸爬滚打数年,接触了各式各样的Java服务端架构。服务端问题见得多了,也就更能分辨出各种方案的优劣。 点击或复制链接查看详情:https://developer.aliyun.com/article/726008 阿里高级地图技术工程师王超:消灭 Java 代码的“坏味道” 代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。 点击或复制链接查看详情:https://developer.aliyun.com/article/720423 阿里基础设施负责人毕玄:Java大牛程序员的学习成长路线 在他的职业经历中,从小白到大牛的过程,在成长方面经历了技术能力的成长、架构能力的成长,以及现在作为一个在修炼中的技术 Leader 的成长。 点击或复制链接查看详情:https://developer.aliyun.com/article/680894 这6种编码方法,你掌握了几个? Don Roberts 提出的一条重构准则:第一次做某件事时只管去做;第二次做类似的事时会产生反感,但无论如何还是可以去做;第三次再做类似的事时,你就应该重构。编码也是如此,当多次编写类似的代码时,我们需要考虑是否有一种方法能够提高编码速度,让编码速度“起飞”? 点击或复制链接查看详情:https://developer.aliyun.com/article/718649 咱们从头到尾说一次 Java 的垃圾回收 之前上学的时候有一个梗,说在食堂里吃饭,吃完把餐盘端走清理的是 C++ 程序员,吃完直接就走的是 Java 程序员。确实,在 Java 的世界里,似乎我们不用对垃圾回收那么的关注。很多初学者不懂 GC,也能写出一个能用甚至还不错的程序或系统。 点击或复制链接查看详情:https://developer.aliyun.com/article/715096 Java工程师该如何编写高效代码? “世界上只有两种物质:高效率和低效率;世界上只有两种人:高效率的人和低效率的人。”——萧伯纳 同理,世界上只有两种代码:高效代码和低效代码;世界上只有两种人:编写高效代码的人和编写低效代码的人。如何编写高效代码,是每个研发团队都面临的一个重大问题。 点击或复制链接查看详情:https://developer.aliyun.com/article/739852 如何降低90%Java垃圾回收时间?以阿里HBase的GC优化实践为例 GC一直是Java应用中讨论的一个热门话题,尤其在像HBase这样的大型在线存储系统中,大堆下(百GB)的GC停顿延迟产生的在线实时影响,成为内核和应用开发者的一大痛点。 点击或复制链接查看详情:https://developer.aliyun.com/article/277268 跑得好好的Java进程,怎么突然就瘫痪了? 你是否有过这样的经历,跑得好好的Java进程,突然就瘫痪了。过于依赖Java虚拟机导致我们对问题无从下手,问题反复出现影响开发效率。其实,多数Java进程瘫痪的原因可以从java虚拟机层面找到原因,本文列举出导致Java进程瘫痪的一些共性原因,供大家交流和学习。 点击或复制链接查看详情:https://developer.aliyun.com/article/728280 学习训练营 为了帮助大家更好地理解手册,我们邀请作者孤尽为大家开发了一套Java七天学习计划,内容来自于新版手册的亮点章节。坚持完成七天打卡挑战的少侠,有机会领取机械键盘、阿里云公仔、双肩包等精美周边礼品! 学习前须知 1.每日学习的知识点都节选自泰山版《Java开发手册》,如想完整阅读电子书的所有内容,请到专题页下载。2.根据约束力强弱,规约依次分为强制、推荐、参考三大类:【强制】必须遵守。是不得不遵守的约定,违反本约定或将会引起严重的后果。【推荐】尽量遵守。长期遵守这样的规定,有助于系统稳定性和合作效率的提升。【参考】充分理解。技术意识的引导,是个人学习、团队沟通、项目合作的方向。 七天学习训练营 - Day1 今日学习内容:关于日期时间的编程规约立刻前往学习:https://developer.aliyun.com/article/754900 七天学习训练营 - Day2 今日学习内容:SQL规约立刻前往学习:https://developer.aliyun.com/article/755082 七天学习训练营 - Day3 今日学习内容:10道Java题测试挑战立刻前往学习:https://developer.aliyun.com/article/755087 七天学习训练营 - Day4 今日学习内容:集合处理立刻前往学习:https://developer.aliyun.com/article/755086 七天学习训练营 - Day5 今日学习内容:异常处理立刻前往学习:https://developer.aliyun.com/article/755085 七天学习训练营 - Day6 今日学习内容:二方库规约立刻前往学习:https://developer.aliyun.com/article/755084 七天学习训练营 - Day7 今日学习内容:直接去认证领奖吧!注意!只有连续完成7天的打卡才能参与认证领奖哦!立刻前往领奖:https://developer.aliyun.com/topic/java2020 阿里云开发者社区——藏经阁系列电子书,汇聚了一线大厂的技术沉淀精华,爆款不断。点击链接获取海量免费电子书:https://developer.aliyun.com/topic/ebook
这本书从实践出发,将阿里文娱团队的经验、思考沉淀其中,汇聚成一幅文娱技术的全景图。(文末送书) 无论是面向5G时代所进行的音视频前沿探索、立足机器智能不断优化文娱体验的摩酷实验室,还是支撑业务高效运转的基础平台、客户端,或是大麦、阿里影业的在线票务与大数据应用,全部都囊括在这本书中。 章节阅读 第一章:更清晰更省流,文娱多媒体音视频技术 2019年,整个互联网的绝大部分流量来自于音视频服务。例如优酷,每日承载了上亿用户的几十亿的视频观看,每日消耗的互联网流量更是高达PB级别。如何让用户体验“更清晰、更省流”,是阿里文娱的核心技术。 点击这里下载本章节 第二章:超级APP背后的移动端技术大揭秘 隔空手势操作、互动视频技术、人脸识别的弹幕跟随......优酷移动端的一路优化革新,无论是从用户体验还是技术上,都是名副其实的“超级APP”。本章从 基础架构、组件化解决方案、播放互动技术、客户端性能优化、工具提效 等方面详细介绍了优酷移动研发团队的经验心得。让你充分了解优酷移动端的前沿开发技术。 点击这里下载本章节 第三章:超详实的优酷质量保障秘籍 优酷技术质量部负责优酷所有业务的质量保障工作,我们不仅需要面对快速的产品交付节奏,还要面对优酷特有的播放场景线下验证的复杂性以及设备碎片化带来的高昂适配成本。 点击这里下载本章节 第四章:全景揭秘阿里文娱智能算法 文娱作为产业互联网发展的重要行业,人工智能技术在这个领域中的应用空间广大,而我们也仅仅是迈出了一小步,期待工程师们能够创造出更大的奇迹,加速文娱产业数字工业化时代的到来。 点击这里下载本章节 第五章:阿里文娱在线票务技术大揭秘 热爱话剧相声演唱会的你,一定也经历过在大麦抢票时的激动吧!但你是否想过,是哪些技术支撑着你在10万+座位中“纠结”,或是让你体验刷脸入场的便捷呢?这个章节为你解读! 点击这里下载本章节 第六章:一次看懂文娱B端核心技术 60秒售出5万张票的抢票技术如何构建?电影垂直行业的云智开放平台如何炼成?百万座席的世界赛事票务系统如何支撑?这个章节告诉你,阿里技术人眼中的B端技术。 点击这里下载本章节 第七章:覆盖全端业务的大前端技术 优酷前端技术如何支撑营销活动?答案是能支撑全端业务的大前端技术。阿里文娱将曾经遇到的技术问题与挑战实践详细展开,整理成了大前端技术这一章节,带你一探文娱前端团队在支撑业务过程中的技术思考和沉淀! 点击这里下载本章节 第八章:从 DevOps 到 AIOps 的运维技术精选 本章以阿里文娱运维团队的实践为蓝本,摘录了具有代表性的经验和总结。包括架构升级、智能运维平台的建设、整个技术资源的流转,以及在资源有限的情况下,如何让高高的业务目标快速落地;如何做整体稳定性,包括用户体验升级,降低卡顿率,而对于AIOps,我们正在做积极的尝试,未来我们希望在智能化方向上进行更多的探索来提升整体稳定性以及资源稳定高效使用。 点击这里下载本章节 截止 4月29日,文章评论区分享出你的学习新的学习技巧,我们将抽取点赞最高的 2 位,送出《智慧文娱:阿里巴巴文娱技术探索之路》实体书 一本! 我们将会在 活动截止次日 在文章底部公布获奖名单,届时将为中奖者提供 个人邮寄地址收集问卷(我们会将您的信息保密处理)。公布后5个工作日内未填写视为弃权,感谢您的参与! 开奖啦!恭喜下面 2位 朋友在积赞送书活动中获得 《智慧文娱:阿里巴巴文娱技术探索之路》实体书 一本!下面是中奖同学名单(昵称): 梓沐vv 1623658889811197 请看到自己昵称的同学于 7日内 在 个人邮寄地址收集问卷 中提供您的个人信息和邮寄地址,我们将在核实后一周内为您发出奖品! 点击或复制链接到浏览器填写 个人邮寄地址收集问卷:https://c.tb.cn/I3.ZwN34
隔空手势操作、互动视频技术、人脸识别的弹幕跟随......优酷移动端的一路优化革新,无论是从用户体验还是技术上,都是名副其实的“超级APP”。本章从 基础架构、组件化解决方案、播放互动技术、客户端性能优化、工具提效 等方面详细介绍了优酷移动研发团队的经验心得。让你充分了解优酷移动端的前沿开发技术。 点击这里免费下载《超级APP背后的移动端技术大揭秘》 精彩导读 作为一个泛娱乐视频平台,优酷APP 是向用户提供高质量视频服务的最重要入口。 通过APP,优酷为用户提供了点播、直播、导看、搜索、社区、互动、会员等服务,而在每一类服务下,又可按不同的维度进行细分。 以点播为例,按时长可分为长视频、短视频;按内容属性可分为OGC、PGC、UGC 视频;按视频播放比例可分为横版视频、竖版视频;按呈现和交互方式又可分为普通视频、VR 视频、互动视频等。这些划分方式并不是独立的,一个视频往往兼具多种属性,需要有对应的播放、交互,和信息服务。同时,这些大的服务门类也不是独立的,彼此相互联系,为用户构建一条条交互动线。 如此多样的服务汇集在一个APP 中,无论从业务还是技术上,优酷都是名符其实的超级APP。与之对应的业务多、开发团队多,这就为移动研发团队带来了非常大的挑战:对内,各团队一方面要保持很高的迭代速度,快速地消化大量的产品需求,尽早把新功能和变化送到用户手中。 另一方面要和不同的团队紧密配合,确保在大规模的开发中保证产品交付的质量;对外,团队面对的是海量的用户群体,在移动用户增量红利逐渐消退的情况下,如何让不同设备条件、不同网络环境的用户都尽可能地享受到高质量的使用体验,是业务增长的重中之重。这就需要研发团队在技术上持续打磨和创新,把效率、质量和体验做到极致。 优酷移动研发团队经过多年的探索和实践,沉淀了大量的技术经验,包括解决方案、研发模式、技术架构、SDK等,不但为优酷业务带来良好助益,也向集团和开源社区提供了参考和借鉴。 本章从基础架构、组件化解决方案、播放互动技术、客户端性能优化、工具提效等方面介绍了优酷移动研发团队的经验心得。 这些技术虽然分属不同模块,但又有相互组合、层层依赖的关系。如插件化页面框架设计是建设标准化开发模式的基础,暗黑模式又是标准化开发模式的一个典型应用;统一的播放器架构规范了播放业务的开发模式,在其上又扩展出酷看、互动视频等创新形式。 希望本章的介绍能够帮助读者对优酷的移动端开发技术有一个体系化的了解。
优酷前端技术如何支撑营销活动?答案是能支撑全端业务的大前端技术。阿里文娱将曾经遇到的技术问题与挑战实践详细展开,整理成了大前端技术这一章节,带你一探文娱前端团队在支撑业务过程中的技术思考和沉淀! 点击这里免费下载《覆盖全端业务的大前端技术》 精彩导读 前端技术一直在快速变化,回顾阿里技术从PC 时代到All in 无线,几年间新技术不断涌现又被快速替代。 与此同时,优酷前端也在不断的进化迭代中,业务从Web 站逐步扩展到移动端APP、OTT、小程序,以及营销系统搭建和运营中后台建设。团队形态也从最初分布在多个业务的小型闭环,逐步集结,融合为面向整体业务横向支撑的“大”前端。 上图是优酷前端技术体系的概况,业务场景多、技术栈繁杂,对前端工程能力的要求不仅限于提效,我们基于阿里工程基础服务之上构建了面向文娱的工程平台,为不同业务技术栈和开发流程的收敛统一提供通用的工程能力。 随着Node.js 的发展,前端同学不只聚焦在端上的交互和展现,开始接管Web 主站服务中间层,并且借助Node.js 服务端渲染的优势,在优酷Web 主站性能和体验上取得了跨越式的提升。 活动营销对于页面高频大量的运营诉求驱动了页面生产方式从源码朝着搭建、智能识别等低代码方式演化。 对于互动能力的需求,也催生着前端在渲染领域的发展,从JS 驱动HTML 结构到借助端渲染能力的RN、Weex,再到逐步回归W3C 子集的Canvas,渲染侧解决问题的维度也在从研发效能、性能、展现能力不断交融变化。 阿里文娱将团队遇到的技术挑战以及解决过程做详细的展开,希望由解决方案的推演抽丝剥茧,一探优酷前端团队在支撑业务过程中的技术思考和沉淀,为读者带来一些启发。
近年来,随着移动智能设备的快速普及,移动多端统一开发框架已成为一个热门话题。闲鱼是国内最早接触使用 Flutter 的团队,经过多次研讨验证并大规模上线,在App性能、稳定性、开发效率上收益甚多。 去年,闲鱼发布了《Flutter in action》电子书,系统地总结了闲鱼在Flutter开发实践过程中的一手实践知识和技术沉淀。 现在《Flutter in action》全面升级,纳入更多创新思考并重新整理全书逻辑——《Flutter 技术解析与实战》正式发布! 复制链接到浏览器即可下载:https://developer.aliyun.com/topic/download?id=19 点击这里免费获取《Flutter 技术解析与实战——闲鱼技术演进与创新》 精彩导读 《Flutter 技术解析与实战》凝聚了闲鱼技术团队的心血,就像弈局一样,通过一步步的反复判断和思考,给出清晰路径。唯有经历了与谷歌团队的长期共建,以及对整个闲鱼规划有透彻思考后,才能淬炼出有如此深度的著作。对于如何使用Flutter以及是否要选择Flutter的开发者或者规划者来说,阅读本书将大有裨益。—— 阿里巴巴副总裁 汤兴 Flutter 凭借着新的渲染引擎、新的编程语言、新的编程框架,俘获了一众开发者的青睐。用不到一年的时间就在 GitHub 和 StackOverflow 上获得了比 React Native 还要高的知名度。 闲鱼技术部 不仅是阿里巴巴集团旗下闲置交易社区的创造者,更是移动与高并发大数据应用新技术的引导者与创新者。 这本书并非基础知识的简单罗列,而是从一线问题出发,循序渐进,娓娓道来。不仅把Flutter的重要理念讲得极为清晰, 而且给开发者提供了应对眼前各种问题的实用方法。 同时,书中还给出了详尽的可以融会贯通、举一反三的思路,理论陈述和问题分析面面俱到,力求让读者可以获得全面系统的技术知识。 章节解构 这本书从通用业务工程化开始,进而展开Flutter在闲鱼整体云端一体化架构的创新思考。 第 1、2 章重点关注 混合工程搭建以及关键能力扩展和优化; 第 3、4 章探讨关于 大规模工程实践 中遇到的具体问题,如 应用架构设计、 性能统计和调优等, 第 5 章将给出整体的 梳理和总结。以期读者可以有一个自顶向下展开的阅读路径。 —— 点击这里免费下载全新电子书 欢迎大家在评论区留言,分享在 Flutter 使用过程中遇到的问题或经验,我们将抽取点赞最高的 5 位,送出《Flutter 技术解析与实战》实体书一本! 《Flutter 技术解析与实战》一经发布便受到读者朋友们的热烈讨论,由于本次活动奖品有限,现补充公布活动规则: 截止2020年4月27日 24时 ,在文章评论区留言,点赞数最高的 5位 将获得实体书奖励! 我们将会在 活动截止次日 在文章底部公布获奖名单,届时将为中奖者提供 个人邮寄地址收集问卷(我们会将您的信息保密处理)。公布后5个工作日内未填写视为弃权,感谢您的参与! 阿里云开发者社区——藏经阁系列电子书,汇聚了一线大厂的技术沉淀精华,爆款不断。点击链接获取海量免费电子书:https://developer.aliyun.com/ebook 开奖啦!恭喜下面五位朋友在积赞送书活动中获得 《Flutter 技术解析与实战》一本!下面是中奖同学名单(昵称): 琴理-qile 中单法师 Thund0r 1721470814751901 1623658889811197 请看到自己昵称的同学于 7日内 在 个人邮寄地址收集问卷 中提供您的个人信息和邮寄地址,我们将在核实后一周内为您发出奖品! 点击或复制链接到浏览器填写 个人邮寄地址收集问卷:https://c.tb.cn/I3.ZwN34
看到脉脉上一网友分享程序员4月份工资,平均工资竟达到14120! 网友:“这头发掉的值” 工资趋势 工资分布: 2020年中国一线城市程序员的平均工资为 16285 元,工资中位数为 14583 元,其中95%的人的工资位于 5000 到 20000 元之间。大连在本月招聘了很多前往日本工作的岗位,工资都很高,导致整个工资比较高。 和往年数据比较: 其中 :北京的平均工资为 18048 ,中位数为 15000上海的平均工资为 16653 ,中位数为 15000广州的平均工资为 13831 ,中位数为 12500深圳的平均工资为 16488 ,中位数为 15000 工作经验 : 数据显示,工资会随着工作经验的增长而增长。 职位 : 和2019年相比,算法工程师的比例从8%提高到了10%。 公司性质 : 公司很重要,选择一个什么样的公司,决定了工资高低。 由上数据可知,欧美外企的工资显著高于其他企业。所以,童鞋们要努力学好英语呀! 公司规模 : 公司越大,工资会越高。 行业: 金融业果然名不虚传,有钱!话说你拖后腿了吗? 图片来源|视觉中国 参考数据来源:有数可据 原文链接:https://blog.csdn.net/juwikuang/article/details/105256285
文娱大脑究竟能有多“智能”?答案是全生命周期的人工智能技术!从内容智能到增长营销,全景揭秘阿里文娱智能算法,就在这一本! 点击这里免费获取电子书 也可选择复制链接到浏览器下载:https://developer.aliyun.com/topic/download?id=18 阿里是一家坚信数据力量的公司,而文娱涉及的相关产业非常广泛,从线上到线下、从影剧综漫到现场娱乐以及文学小说等,其组成、形式、展现、分发的复杂性交织在一起为业务数据化带来了巨大的挑战。 近三年来,阿里文娱摩酷实验室始终以助力业务发展和增长为核心驱动,形成如下四个的技术方向: 内容理解是文娱相关算法技术的基石,IP、小说、剧本、视频、音乐等不同形态的内容对构建起领域知识图谱带来了很多困难,在这其中计算机视觉、自然语言处理、图谱&推理、图神经网络、多模态内容分析等技术被广泛应用于内容解构。以视频为例,影剧综视频的时长很难用一些低层级的标签来抽象表达其内容,基于多模态的分析技术在这类内容上也会碰壁,因此融合内容专家及机器学习系统的半自动化微标签体系成为一种可行的出路。与短视频快速的线上反馈闭环不同,即使制作周期最短的综艺节目也需要 3 个月以上,期间还面临内容监察审核的不确定,这就导致影剧综内容制作高度的不确定性,如何基于复杂的数据分析线索以及历史的成败规律来选择评估内容是各个综合视频平台所面临的核心挑战之一,而阿里文娱北斗星系统就是用来解决这一问题的。 搜索和推荐作为两种解决信息爆炸的重要手段被广泛应用于各个 APP 中,而影剧综内容的复杂性导致用户想精确描述一个内容非常困难,仅通过节目名、演员名去检索给用户也造成了很大的困扰。在文娱内容的分发体系中对搜索模式、推荐模式的融合成为新的用户需求,如何更为准确的通过类强化学习的用户意图理解过程来协助他们尽快找到喜爱的内容,成为文娱搜推体系下一阶段的首要任务。 文娱作为产业互联网发展的重要行业,人工智能技术在这个领域中的应用空间广大,而我们也仅仅是迈出了一小步,期待工程师们能够创造出更大的奇迹,加速文娱产业数字工业化时代的到来。
大家好!我是很久没和大家见面的阿里妹。2020年的开头属实不太顺利,从大年三十就没出过门的阿里妹感觉身上已经结了好几层蜘蛛网了。此次,阿里妹为大家带来了技术人自我提升学习清单,点击链接即可获取。 Java 干货合集: 学精 Java,晋升不愁 - Java 技术圈 Java 精品视频/直播合集 2019 年最火 15 篇 Java 文章合集 【名师课堂】Java零基础入门 零基础学Java10系列一:编程入门 零基础学Java10系列二:面向对象编程 零基础学Java10系列三:Java高级编程 Python 干货合集: Python 礼包:3大阶段,30+教程,超全年度礼包大放送 【精品问答】Python实战100例 - 附源码 前端干货合集: 阿里巴巴D2 前端论坛最全视频来了(附PPT下载) 独家下载 | 看阿里如何实现前端代码智能生成 【精品问答】前端开发必懂之HTML技术五十问 大数据工程师必看(2月5日更新): 阿里云实时计算技术圈 阿里巴巴大数据技术圈 【精品问答】大数据技术问题之Flink百问 大数据精品文章合集(2月5日更新) 大数据精品视频课程合集(2月5日更新) 大数据简史课程(2月5日更新) AI 干货合集: 达摩院 AI Inside 同行者线上大会 数据库干货合集(2月6日更新): 数据库及SQL/MySQL基础课程 SQL进阶及查询练习 MySQL高级应用 - 索引和锁 PostgreSQL数据库快速入门 数据库精选视频 十大数据库精选文章 IoT干货合集(2月4日更新): 10 篇 IoT 精品文章合集 IoT 精品视频/直播合集 走进阿里云物联网 面试干货合集: 面试资料库:面试真题讲解 大咖经验输出 【精品问答】110+数据挖掘面试题集合 顶级技术精华·电子书合集: 超全阿里系电子书年度合集来了!热门新书持续更新中... 《高德技术2019年刊合辑》 爆款技术文章合集: 阿里技术年度热文TOP 10 蚂蚁金服年度最受欢迎文章合集 阿里云 MVP 2019年度技术盘点 《达摩院2020十大科技白皮书》 钉盘密码:YPZ6 精品问答:进阶3000问 阿里开发者工具盘点 学习资料合集: 开发者免费资源库:学习必备资源,助你打怪升级 九大热门技术学习路线 2019必看8大技术大会&300+公开课全集(500+PDF下载) 阿里云大学精品在线课程免费学
此时此刻,阿里巴巴10亿元医疗物资供给专项基金正在全球采购医疗物资,阿里云的AI算力正在支持着国内外数十家权威医疗科研院所研发药物,阿里钉钉免费开放平台支持远程办公、远程学习……阿里巴巴正全力发挥着“经济体”的强大力量来应对疫情。 2月4号,阿里云免费开放多门在线精品课程,为这股力量注入了新的能量。从阿里云云计算、大数据、云安全等ACP认证考试辅导课,到云原生技术学习、达摩院技术解析等精品课程,阿里云希望借此,助力学生停课不停学、助力Soho办公“充电”不停。 点击这里 开始学习 线上精品课免费学 疫情期间,阿里云大学线上精品课免费向所有用户开放,包括人工智能实战案例、云上常见架构设计及优化、阿里专家带你玩转DevOps、MongoDB入门到云上开发、Python网络爬虫快速入门等,共计25门。 线上还有更多适合云计算、大数据、人工智能开发者和爱好者的免费学习资源,包括11个开发技能学习路线,包含3000+课时、3000+线上自测试题,从理论,到应用,到自我技能检验,一站式学习。 阿里云ACP认证辅导课1分钱 阿里云认证自推出以来,基于阿里云云计算、大数据、云安全等核心产品技术领域,构建了完善的认证体系。其中,专业工程师认证(ACP级)已经成为数据智能时代,行业企业专业技术人才的通用标准。阿里云及生态体系内的众多企业已将该认证作为人才招聘、选拔、评价的重要标准。 此次,阿里云大学将原价900元的ACP认证线上辅导课降至1分钱,助你轻松备考ACP。 关于阿里云大学 阿里云大学是阿里云官方创新人才培养平台,致力于打造从it时代向dt时代转型过程中在云计算、大数据、人工智能、云安全等领域一所创新人才工场,打造从学、到练、到赛、到考、到就业与创业的创新型人才培养的全方位生态链路。 阿里云大学结合丰富的行业实践和人才沉淀,对外输出针对泛云生态人才的专业认证体系,形成场景化技能认证(Apsara Clouder)、综合能力权威认证(ACA助理工程师认证 - ACP工程师认证 - ACE架构师认证)、专业岗位角色认证(运维、开发测试、网络工程师等),已经成为泛云计算领域行业人才技能标准,为领域人才培养和鉴定,提供了强有力的支持。 点击这里,访问阿里云大学官网
抗疫情工具+方案+资源持续更新,点击“战疫情,我们在一起!”专题了解。 抗击疫情如救水火,必须与时间赛跑! 1月29日,浙江省卫生健康委员会确认,目前已经应用“疫情信息采集系统”进行信息管理并支持决策,在疫情攻坚战中“分秒必争”。 据介绍,“疫情信息采集系统”由阿里云提供技术支持,系统将覆盖浙江省11个地市卫健委、90个区县卫健局、上千个基层防控工作小组。 面对突发疫情,信息化技术支持尤为重要;应对突发状况,要求系统能快速上线、灵活应对。但是传统的系统开发建设周期长、灵活性差,无法满足实际工作需求。 面对疫情传播,时间就是生命。 面对新型冠状病毒不断升级的疫情,浙江省卫健委联合阿里巴巴、浙江谷瞰服务团队,通过阿里云宜搭平台,仅用时1天就搭建出疫情信息管理系统,并能按照最新需求迅速调整以满足工作需要。该系统可以支持多级部门数据实时导入,同步给出统计分析报表,解决了基层疫情上报繁琐、区县市级收集耗时耗力等问题。基于该系统的实时展示功能,还为政府部门的决策提供直观的数据支持。 据了解,全国15个省市、100多个区县、10万多个基层医疗单位正在应用阿里宜搭平台搭建疫情相关的信息采集、管理系统。为了让更多政府、企业快速生产类似应用服务,阿里云表示向全社会开放宜搭搭建平台及每日健康打卡、企业返工情况跟踪等免费模板,直至疫情解除。阿里宜搭平台通过可视化拖拽的方式,即使不会代码也能迅速搭建应用,对抗疫情。
随着双12的落幕,2019也接近尾声了。经过了一年的奋(tuō)斗(fà),你是否还有遗憾和未尽的目标呢? 开发者社区是不会让你带着遗憾跨年的!我们甄选了 2019 全年阿里云开发者社区最受欢迎的 30+本 电子书 , 从全民网红级的 华山版《Java开发手册》 ;到涵盖飞天大数据平台核心产品玩法的《大数据工程师必读手册》;从红遍全国的《长安十二时辰》背后的技术深度解析;到聚集技术大咖专家的《阿里巴巴云原生实践15讲》…… 4 大领域,30+ 本电子书 免 费 下 载 ,2019,不留遗憾! 更多礼包点这里:阿里如何用Java?8位专家讲解,871节课程,带你学Java3大阶段,30+教程,超全年度 Python 礼包大放送 开发手册类: 华山版《Java开发手册》 网红级的开发手册,始于阿里内部规约,在全球Java开发者共同努力下,已成为业界普遍遵循的开发规范,涵盖编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程规约、设计规约七大维度。修炼一年终出关,这个版本将会给开发者带来更多惊喜。马上下载>> 《大数据工程师必读手册》 阿里巴巴如何玩转大数据?十位阿里巴巴大数据专家深度分析 ,飞天大数据平台八款产品最新玩法,2019不容错过的大数据手册——《大数据工程师必读手册》现在可以免费下载阅读啦,赶紧先睹为快吧。立刻获取>> 《阿里云AIoT开发手册》 物联网开发全路径讲解,从设备端到云服务器再到应用端,适合嵌入式、服务开发、应用开发等各种背景开发者学习,助你迅速了解物联网解决方案的架构和实现。点击查看>> 《0代码,搭应用:宜搭开发手册》 宜搭是阿里巴巴自主研发的,人人都能使用的0代码应用搭建平台。任何一个没有编码能力的人,通过宜搭可视化拖拽的方式,都能轻松搭建出自己想要的应用。传统模式下需要13天完成的应用,用宜搭2小时便可完成。开始学习>> 《Knative 云原生应用开发指南》 自 2018 年 Knative 项目开源后,就得到了广大开发者的密切关注。Knative 在 Kubernetes 之上提供了一套完整的应用 Serverless 编排服务,让应用开发者可以不用为底层的基础设施分心,把更多的精力投入到业务逻辑上。点击查看>> 《视觉计算开发者系列手册 · 第一期》 从简单的图像分类到3D姿势识别,计算机视觉从来不缺乏有趣的问题和挑战。通过肉眼我们可以检测出一张宠物照中的猫和狗,可以识别出梵高作品《星夜》中的星星和月亮,那如何通过算法赋予机器“看”的智能,就是这本书将要讲到的。点击查看>> 技术解析类: 《Flutter in action:闲鱼Flutter企业级实践精选》 Google Flutter 产品经理强烈推荐,闲鱼将自己的最佳实践经验整理成册,揭秘亿级流量背后的技术秘籍,为你精解Flutter企业级实践。立即获取>> 《长安十二时辰背后的技术秘籍》 《长安十二时辰》一经播出便红遍全网,从智能算法到音视频创新技术,从智能档的技术挑战到高可用的媒资平台,成就这华丽视效的爆款背后,阿里文娱都用到了哪些“武林秘籍”?马上了解>> 《双 11 背后——支付宝技术升级战》 蚂蚁金服全新电子书《双 11 背后——支付宝技术升级战》正式上线!大家耳熟能详的双 11 “剁手日”,在技术人眼里又是什么日子?如果你还认为是“买买买”,那你就错了!准备好迎接一个熟悉却陌生的双 11 “新定义”吧!快去下载>> 《5G+AI 阿里文娱技术实践》 如何用技术带给用户更加流畅且个性化的体验,这是阿里文娱一直在突破的关卡。本书将通过窄宽高清革新、大麦物联网技术、6DoF视频技术等5大板块,带你全面了解阿里文娱独具魅力的思考。点击查看>> 《阿里巴巴云原生实践15讲》 从 2011 年起,阿里巴巴通过容器实践云原生技术体系,在整个业界都还没有任何范例可供参考的大背境下,逐渐摸索出了一套比肩全球一线技术公司并且服务于整个阿里集团的容器化基础设施架构。阿里巴巴的技术团队完整的经历了云原生技术浪潮里的所有关键节点,作为这场技术革命的见证者和实践者,阿里在本书中聚集一线技术专家全面揭秘阿里巴巴云原生之路上的探索与实践。立刻获取>> 《不一样的 双11 技术,阿里巴巴经济体云原生实践》 2019 双11,订单创新峰值达到 54.4 万笔/秒,单日数据处理量达到 970PB,面对世界级流量洪峰,今年的阿里巴巴交出了一份亮眼的云原生技术成绩单,并实现了100% 核心应用以云原生的方式上云。马上了解>> 《蚂蚁金服在线金融技术解读》 过去十五年来蚂蚁金服在数字金融领域持续创新,打造”BASIC”技术战略布局并对外开放。随着人工智能时代的到来,蚂蚁金服积极拥抱新技术,面向金融场景打造面向未来的金融级技术。点击查看>> 《阿里巴巴大数据及AI实战》 在阿里云提供的统一技术平台上,阿里巴巴的各个业务部门沉淀了很多优秀的方法论。通过这些最佳实践的分享,我们希望能够和企业,和开发者一起探索,进一步推动数据智能领域的创新和落地。立刻阅读>> 《优酷 APP “暗黑模式”设计与技术完整总结》 随着iOS 13和Android 10的正式发布,一个名词“暗黑模式(Dark Mode)”逐渐走入了大家的视野。我们邀请了参与优酷App暗黑模式设计/开发/测试的同学们编写《 优酷APP全量支持“暗黑模式” 设计与技术完整总结》,全面介绍了整个项目的实施流程和经验教训,也是对整个项目做一个完整的总结。了解详情>> 《高德技术2019年刊合辑》 回首2019 年,作为首个日活过亿的国民出行平台,高德地图 to C 和 to B 的用户数都再攀新高。在背后支撑和驱动业务快速发展的,正是数千名日夜奋战的高德技术人。现在《高德技术2019年刊合辑》免费推出,6大章节全年盘点,为你揭晓有“温度”的科技!立刻下载>> 职业发展类: 《阿里工程师的自我修养》 阿里技术公布了一波阿里P8、P9技术大牛的思维模型,将他们的思维模式呈现出来。你可以在阿里资深专家职业生涯的真切感悟中,找到应对危机的最佳方法。立刻获取>> 《中国企业2020:人工智能应用实践与趋势》 阿里云已大规模实践产业AI,将人工智能应用于各行各业。阿里云研究中心结合大量的产业实践,在白皮书里提出了中国企业应用人工智能技术的成熟度分析和阶段性演进路径,总结出人工智能为企业创造价值的7大模式,为企业应用人工智能提供指导。点击查看>> 《Elasticsearch 中国开发者调查报告》 为了了解 Elasticsearch 中国开发者群体,结合1186位开发者的调研数据和18位社区专家的深度访谈,那么,这个群体是谁?他们在怎样使用 Elastic Stack ?他们又将如何进阶成长?马上了解>> 学术论文类: 阿里云研究中心10+本白皮书全套下载! 经过大量的案例调研和深度研究,阿里云研究中心完成了零售、数字政务和城市治理、制造、金融、传媒、教育等多个行业数字化转型路径和方法论的思考和沉淀。在此基础上,通过扎实的workshop微咨询服务等产品形态,阿里云研究中心已经成为很多企业数字化转型的“战略顾问”。一键获取>> Learning Disentangled Representations for Recommendation | NIPS 2019 论文解读 近年来随着深度学习的发展,推荐系统大量使用用户行为数据来构建用户/商品表征,并以此来构建召回、排序、重排等推荐系统中的标准模块。普通算法得到的用户商品表征本身,并不具备可解释性,而往往只能提供用户-商品之间的attention分作为商品粒度的用户兴趣。在这本书中,想仅通过用户行为,学习到本身就具备一定可解释性的解离化的用户商品表征,并试图利用这样的商品表征完成单语义可控的推荐任务。了解更多>> Understanding and Improving Layer Normalization | NIPS 2019 论文解读 作者们认为,前向归一化并非LN起作用的唯一因素,均值和方差也是重要原因。它们改变了后向梯度的中心和范围。同时,作者还发现,LN的参数,包括bias和gain,并非总是能够提升模型表现,甚至它们可能会增加过拟合的风险。因此,为了解决这个问题,作者们提出了自适应的LN(简称AdaNorm)。AdaNorm将LN中的bias和gain替换成线性映射函数的输出。这个函数能够自适应地根据不同的输入调整权重。作者们在七个数据集上做了实验都表明AdaNorm能够取得更好的效果。同时可以看到,AdaNorm缓解了过拟合的问题,并且给训练带来更好的收敛效果。了解更多>> 更多电子书和精彩内容还在不断更新中,2020 社区和广大开发者一起进步,还将带给大家更多精彩内容!持续关注 开发者社区 和 开发者学习资源库 哦!
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 双 11 模块 79.34% 的代码是怎样智能生成的? 作为今年阿里经济体前端委员会的四大技术方向之一,前端智能化方向一被提及,就不免有人好奇:前端结合 AI 能做些什么,怎么做,未来会不会对前端产生很大的冲击等等。本篇文章将围绕这些问题,以「设计稿自动生成代码」场景为例,从背景分析、竞品分析、问题拆解、技术方案等几个角度切入,细述相关思考及过程实践。 最强干货 不要再叫自己“程序员”了 程序员不要将自己限定在写代码这一单一职能上,需要认清自身商业价值的本质,需要锻炼自己的沟通能力,擅于表现自己。职业只是一种生活方式,并不能完全支配我们的幸福。我们应该为了生活而工作,而不要为了工作而生活。 首度公开!OceanBase存储系统架构的演进历程及工程实践 作为一款100%自研的分布式数据库,OceanBase历经了近十年的发展历程。近十年来,OceanBase的存储架构经历了多次演进,以解决业务越来越复杂苛刻的存储需求。本文整理自赵裕众(花名陈群)在2019 SACC中国系统架构师大会中的演讲。 2019 年度全球程序员薪酬报告:40岁以后普遍遭遇收入天花板 日前 ,Hired 发布了《2019 年度薪酬状况报告》。该报告聚焦于全球 13 个城市的技术领域发展状况,该报告特别关注了软件工程师、产品经理、DevOps 工程师、设计师以及数据科学家等技术工作者的薪资。 每天读本书 《计算机程序的构造和解释(原书第2版)典藏版》之二:构造数据抽象 在这一章里,我们将进一步去考察更复杂的数据。第1章里的所有过程,操作的都是简单的数值数据,而对我们希望用计算去处理的许多问题而言,只有这种简单数据还不够。许多程序在设计时就是为了模拟复杂的现象,因此它们就常常需要构造起一些计算对象,这些对象都是由一些部分组成的,以便去模拟真实世界里的那些具有若干侧面的现象。这样,与我们在第1章里所做的事情(通过将一些过程组合起来形成复合的过程,以这种方式构造起各种抽象)相对应,本章将重点转到各种程序设计语言都包含的另一个关键方面:讨论它们所提供的,将数据对象组合起来,形成复合数据的方式。 精品公开课 超燃!Flink Forward Asia 2019 大会主会场精彩直播 11月28日,Apache Flink 及大数据领域顶级盛会 Flink Forward Asia 2019重磅开启! 阿里巴巴集团首席技术官、阿里云智能总裁行癫与多位来自阿里、腾讯、美团、字节跳动、百度、英特尔、戴尔科技集团、Lyft、Netflix 及 Flink 创始团队等近 30 家知名企业资深技术专家齐聚北京国际会议中心,与全球开发者共同探讨大数据时代核心技术与开源生态。 无论你关注算力、大数据相关技术,还是人工智能或企业数字化转型,顶级嘉宾阵容,邀你一起探索强大算力关键技术与数字化转型未来风向。 每日集成开发者社区精品内容,请持续关注开发者必读。
11月22日,中国工程院公布2019院士增选结果,阿里巴巴技术委员会主席王坚当选院士。 回顾过去10年,王坚主持研发了中国唯一自研的云操作系统——飞天,突破世界级技术难题,实现中国云计算从0到1的突破。王坚是如何看待中国技术的?他对于技术创新和布局又有什么样的思考?开发者社区整理了这十年间关于王坚博士的经典采访Q&A,为你揭晓他作为一名顶尖技术人的思考。 技术人的成长之路: Q:请您回顾一下您经历过的这么多事情。有哪些您觉得是对您个人的发展有重大作用的? A:其实我很难讲哪些事情对我个人发展有重大的作用,只能说是我记住了哪些事情。我想,至少发生了那么多事情,这些事情我记住了,没有忘掉。以前我在学校,年轻的时候就评为教授,然后我突然就发现,其实周围有很多人帮助我很多——比我年纪大很多的、大 20 岁 30 岁的。那个时候有很大的感触。后来离开学校,对我来讲也是件很大的事情。在当时只是感觉工作跟以前是不一样的,但说不上来怎么不一样。后来到 2008 年加入阿里巴巴以后,这时候突然就会发现,跟你工作的人都比你年轻 20 岁。我觉得倒真的不是某件特别的事情让我记住,但是我从跟比我大 20 岁的人一起工作,突然变成了跟比我小 20 岁的人一起工作,这让我发现,一个事情不只是工作的问题。就是说:除了自己的工作之外,我还可以做些什么?当时别人替我做了那么多,现在的我能为他们做什么事情? 我觉得这对我有很大的影响。 Q:您如何评价您现在的性格? A:我觉得我比较运气的地方,就是今天想做一件事情的时候,不需要有特别的边界。但我这个结论,我不知道是我的性格?还是我现在所处的环境?还是别人对我的宽容?这是很难讲清楚的。认真想想看,在很多事情上我都是个既得利益者。因为这个时代的发展,你碰巧在这个地方,还可以想一些过去想都不敢想的事情,这其实是件很奢侈的事情。你可以想想,可能今天一家企业的科研经费,就是过去一个国家的科研经费,这样的变化在 30 年之内完成,是非常不容易的一件事情。在那么短的时间里面有这么一个跨越,经历这么一个事情,我觉得这个是每个人都值得去反思、去想一想的。 Q:那么您关注量子计算的原因又是什么? A:我其实没有特别关注,只能说是我想去了解,大概知道这个行业的发展。我想如果从这个角度讲,关注量子计算一个非常重要的事情,就是 等到计算跟数据真正集合的时候,你才会发现只增加几十倍的计算量是不够的,肯定要想到的是百万倍,甚至更多的计算量的增长,我想这个时候可能量子计算是唯一能够满足你需求的。但是我还是要讲,把这两个东西合在一起就够我们走上五年、十年了。没有那么简单的。所以我想也给量子计算创造出一个时间的缓冲出来。其实大家没有那么迫切说,今天什么事情非量子计算不行。今天你想做什么事情,还是有条件做的。 Q:您除了计算机,除了之前学的东西和做的工作之外,还有别的兴趣吗? A:对机器我都很有兴趣——计算机也只是机器的一种而已。我觉得其实世界上只有两种东西,一个是人造出来的,一个是大自然造出来的,我只是碰巧——不管是历史的原因还是什么原因——天天接触人造的东西比较多一点,自然对那个东西的兴趣就会比较多一点。 Q:如果从未来往现在看的一个角度,您希望您在现在这个时代扮演一个什么样的角色? A:好像没想过这个。很难想象这个问题。我觉得没有办法从未来看现在,对吧?我是觉得,你所有想的事情都是未来的事情,是这样想才对。前几天云栖有几个人在说他们农村保护的事情。现在很多人讲农村的时候,都不知不觉给人家一种感觉——是不是要回到过去?其实是回不去的,你知道吧?所以其实真正的问题是说,未来的乡村到底是什么样子,而不是说把乡村回到过去,那样走不通的。我觉得更重要的是说,你想想未来会发生什么变化。那么我现在看未来,做城市大脑一个很清楚的目标,就是未来的城市只要今天城市的 1/10 的资源、1/10 的土地、1/10 的水,就可以让现在这样一个城市活下来。我觉得这是一个巨大的挑战。想象一下今天的所有的马路都只有原来的 1/10 的量,这个城市还是蛮美妙的。 来源:二叉树王坚博士,那个行走于现在与未来之间的大顽童 Q:您认为现在的世界最需要什么,以至于您今天要如此强调年轻人、创新、自信这三个词? A:我认为今天的世界最需要的就是年轻人的声音。在今天,年轻人的声音还不是世界的声音,我们需要让年轻人的声音成为世界的声音。年纪大的人总想要教别人东西,但是年轻人应该有更多机会直接从挑战当中学习。大部分年轻人创业,几乎注定是要失败的,但是好的社会应该宽容他们,不要让他们一蹶不振,因为最肥沃的黑土——财富的象征——都是从尸体的养分中生成的。失败的项目们,就应该让它们成为黑土。我们应该像对待幼儿园的小朋友们一样对待年轻人,因为他们是未来,是早上 7、8 点钟的太阳。 来源:InfoQ 王坚博士眼中的中国技术与我眼中的王坚博士 顶尖技术人如何思考技术: Q:大家想到云计算的时候,一直讲对于企业的运用,那么云计算对普通消费者来说有什么实际意义? A:这是非常好的一个问题。大家一开始讲云计算,对企业的来说可以马上赚到很大的钱,企业有钱,实际上今天的云计算为什么会那么热,不是因为大家炒的,就是因为今天的云计算已经深入到了每个人的生活当中。举一个最简单的例子,如果今天用苹果,上面有一个应用,智能画报,打开应用的时候,后台其实就在阿里云,其实今天在智能手机上看到的应用,后台一定有云服务去支持,除非完全是本地的游戏。有一个例子很好,有一个很小的九句单词,不知道有没有人知道,两百多万的用户,新浪上有一两百万的粉丝,一打开这个时候,后台也在阿里云,所以你今天不小心用的什么东西,其实云计算在各地的服务,只是你不知道而已,就像大家插电,不知道是哪个电厂一样,世界已经变成这个样子了,这就是他的真正的魅力。 来源: eNet硅谷动力 阿里云王坚:阿里巴巴没有做手机 Q:您为什么认为互联网是社会的新基础设施? A:其一,互联网不仅仅是互联网公司的事,互联网正变得无处不在。其二,互联网本身作为一个服务,其服务越来越像一个基础设施的服务。其三,互联网本身所表现出来的一些经济特性,也越来越像基础设施。从我个人的体会看,我收到第一封电子邮件的时候,那时的互联网不能称为基础设施,为什么?因为我收的一个电子邮件,账号在高能所,需要花6000元去开通电话,还需要打长途到北京,才能到高能所收一个邮件,邮件的收费对我来说需要极高的成本,所以那时的互联网真的只是一个工具。而今天甚至可以说,没有互联网就没有GDP。我理解的互联网的演进是这样的,一开始把PC连接在一起成为互联网,后来把手机连在一起变成了移动互联网,后来越来越多的东西被连到了互联网上,变成了物联网,事实上物联网并不是比互联网更高明的东西,它只是说要让更多的东西到互联网上。最后到互联网上的东西是人的大脑,这是终极目标。这绝不是一个短期的过程,我认为至少需要100年的时间,在这个过程当中,技术可能会发生很多变化。 Q:在你以前的演讲中频频提到未来互联网技术方向有两个:一个是计算,一个是数据,计算、数据、互联网之间到底是什么样的关系? A:这三者是非常有意思的“品”字形三角关系。互联网是基础,当越来越多的东西连到互联网上之后就产生大量的数据,这些庞大的数据就像铁矿石一样,计算是能源动力、引擎,通过计算分析,数据就产生了价值。三者的关系是先有互联网然后沉淀为数据,通过计算来产生经济价值。 计算经济的特点是数据只有交换才产生价值,和其他不同的是,你交换出去的数据还是你的,不像其他东西你交换出去,你自己就没有了。在未来你会发现,没有什么是和数据没有关系的,你喝的水、吃的大白菜都和数据有关系。因为有了无处不在的公共计算,你能够知道你吃的每一粒米从哪里来,这个土壤的基本情况如何,在与你的其他数据结合在一起,就可以分析出对你的身体有什么影响,何时得什么疾病,从而可以解决很多人类大问题。 Q:就你所定义的计算经济来看,你认为中国与国外相比有哪些不同特点和差距? A:我觉得没什么差距,从宏观的角度看,大家现在都处于非常早期,因为是早期,尽管有差别,但回头来看这些差距也不重要,可以忽略不计。 从发展的角度看,如果我们不努力就真的有差距了,这也是令我比较担心的地方。需要在中国市场把云计算发展起来,要想发展云计算,要想让中国的云计算服务未来,服务全世界,要做好几个关键点。一是要把计算当作公共服务。目前整个国家对计算的重视程度还是远远不够的,而且更多关注还是传统IT,包括我们讲的IT国产化等等,其实还是从传统IT的角度来看IT,我们需要将眼光从传统IT转向未来IT,只有将思路从传统计算转向把计算当作公共服务的理念,才能说,我们的计算模式是面向未来的。二是重新认知数据。数据是没有界定的,就像中国早期的土地,在没有进行土地承包之前,土地的价值潜力没有完全发挥出来,土地有没有价值不是土地自己决定的,而是要看它种什么东西。即便今天我们对数据的利用和对数据的认识也还是很浅层的,未来互联网的竞争一定和数据的利用密切相关。 来源:中国电子报 阿里巴巴CTO王坚:中国可考虑建互联网“特区” Q:如何区分传统公司和互联网公司? A:互联网发展到今天出现很多大企业,最兴奋的不是诞生很多大企业,而是给未来的人创造很多机会,这是这本书最关键的事(《在线》(being online)是王坚在 2016 年写的书)。书名为什么取 being online?这不是一个很热门的词汇。当时出这本书有我跟马云的一个小段子,在大陆出版时的书封面设计是一个小格子,马云说:“这是上一世纪的书的封面,谈的是下一个世界的事情。”我想讲的是,互联网处在整个时代的“开始的开始的开始”,不管是 IoT 或现在讲 AI,其实我们都没有离开过互联网。互联网已经不单属于电机工程的人,也不单属于 Facebook 、阿里巴巴,而是变成了每一个人、每一家企业的,变成了一种基础建设,所有每家公司都有巨大的机会。互联网公司跟传统软件公司最大的差别就是对数据的看法,所有软件公司都觉得点鼠标是没有价值的,Google 发现鼠标点一下可能没什么价值,但你点进去做什么,它利用计算能力,能把商业价值算出来、猜出来的时候,这就是广告,计算能让数据产生价值,把沙子变成金子。 Q:大国的网络公司垄断了大国的生态系统,也在全世界范围内实现垄断,这样的差距未来可能缩小? A:这件事我很乐观。历史上始终有资源不对称、不确定性等问题,互联网发展到今天,提供了让各路英雄涌现的更大的机会,要出现像 Nokia 这样大公司的机会比以前还大得多,因为互联网让大家的距离大大缩短,第二点,同时也更重要的是,把计算变成公众服务很关键,过去只有 IBM 有超级计算机,但现在每个人都可以做,让每个人可以平等,所以基础设施很重要。这不是大小决定而是基础设施好坏决定的。 Q:目前 AI 的发展是否存在瓶颈或是大家没注意到的问题? A:人工智能的问题上我要再强调一下,美国把那么多的钱力和最顶尖的人才投入到APP开发中,这是付出了代价的,其他领域上的创新会受到影响。如果在 AI 部分,我们把太多资源压在一些 30、40 年前的问题的话,例如语音识别、人脸识别、模仿人类,这会是极大的浪费,就是有问题的。AI 应该是互联网的一部分,以后 AI 的专长应该是人不能做的事情。 Q:云计算是否有成熟的标准? A:我也不知道,但有几个要素很重要,第一个是,目前全世界计算量还不是靠云计算就能完成的,整个百分比来看还是很小的。当初我说,希望阿里能贡献全世界 70% 的计算,这不是市占 70%,这是一个成熟的标准。第二,从经济的角度,我们常常用电量来评估一个地方经济的好坏,所以我觉得还是和计算量有关系。最后一个重要的标志,如果真正的云计算起来的话,大家就不会再关注云计算本身了,就像我们不会关心电厂有多大一样。现在我们还处在非常初级的阶段,因为大部分的 CPU 还不在 Cloud Computing 上。 来源:阿里技术 揭开国家AI创新平台“城市大脑”的神秘面纱 Q:您如何理解“城市中枢系统”? A:如果杭州每天有 120 万辆车在路上,在我们说话的这个时间点(21:00),路上跑的是多少辆车?是 20 多万辆。你再猜,高峰时期是多少呢?只比现在多出了 9 多万辆,所以,我们要解决的是这不到 10 万辆车的拥堵问题,而不是 120 万辆。现在的“城市大脑”通过处理上万个路口的数据,找到关键交通变量,可以在几分钟内完成上 1500 多个信号灯的交通配时控制参数的优化,同时,杭州市通过「城市大脑」实现主动报警和主动处置的闭环,然后指派交警机动队去现场处置交通事故。在杭州试点后,“城市大脑”带来的效果是,相比北京,杭州市高峰上下班可以实现晚一小时出门,杭州物理结构最复杂的一个立交桥,其通行速度最高提升了 50%。最终,城市大脑试图实现的,是将城市打造成一个与人有机互动、自我调节的生命体,解决今天仅靠人脑无法解决的城市发展问题。过去 100 年,从我们有了马车开始,到有了内燃机,再到火车、高铁、飞机,实际上我们都是在“马力”时代里,去提升我们的交通速度。但下一个时代,是从马力时代,进化到算力时代。 来源:36氪 王坚的登月计划,和给年青人的 2050 Q:您能介绍一下量子计算吗? A:芯片开放基金会这都是云计算推动的。互联网推动软件开发创新,无论是开源还是闭源,不论是什么框架,都会有所冲击。如果要在如今的技术趋势中选择,我一定会选择量子计算。量子计算会对云计算产生革命性影响。只有在这方面,我们才能有真正的发言权。量子计算是一种依照量子力学理论进行的新型计算,与传统的二进制不同,它是通过对量子进行定位,然后用量子信息位的改变来编码信息。量子计算将有可能使计算机的计算能力大大超过今天的计算机。 来源:CSDN 王坚:做底层一致,面向全球的公共云计算服务 Q:您如何看待智能技术正重塑媒体行业的说法? A:互联网和计算技术发展到今天,我们迎来了一次巨大的发展机会,有了万物互联和海量数据,能够利用计算能力解决仅靠人解决不了的问题。智能技术唤醒了所有沉睡的新闻资源。手机改变了非常多的东西,每个人对新闻的消费更便捷,了解世界上以前一辈子可能都了解不到的事情。“媒体大脑”是智能技术和媒体行业深度融合的一次创新尝试,也说明了智能技术正在重塑媒体。未来媒体行业也将为智能技术进步做出贡献。媒体是非常具创造力的行业,它的发展也会反向推动互联网和人工智能的发展。就像电商对互联网、工业对互联网一样,促进人们思考和解决以前没有想过的问题。下一个五年、十年就会有这样的发展,值得我们共同期待。 来源:新华网 阿里巴巴王坚:智能技术正重塑媒体行业 Q:您看一个技术,是实用的角度多吗?您的价值判断是什么? A:跟心情、跟角色是有关系的。你想用一个技术,当然是要看它的实用价值。但是你觉得好玩的时候,你当然不会去看它的实用价值。所以我觉得跟心情有关系了。你为了玩去了解一个东西,跟你为了用去了解一个东西,它本来就是有这些属性。所以我觉得这个问题取决于你自己当时的出发点和心情。我觉得每个人其实都会这样的,因为他所处的角色不一样,只是每个人在谈技术的时候,他都用了一个特定的角色去谈这个技术而已。 Q:您眼中的中国技术的现状是什么呢? A:我们今天这个时代,很像是 19 世纪末到 20 世纪初那个时代。在那个时代,美国对于世界的贡献,逐渐超过了欧洲。而在今天这个时代,中国对于世界的贡献,正在逐渐超越美国。要想真的实现中国对于世界的贡献最大化,必须要把更多的机会交给年轻人。数据领域的突破线索就掌握在这些无惧数据自由流动的年轻人手中,而其他很多领域也是同样。 Q:什么才是真正的创新?什么创新才是人类应该拥有的自信? A:今天我想讲两个词都跟架构师有关系,一个关于创新,一个关于自信。5、6 年前很多人讲云计算,2、3 年前很多人讲大数据,去年很多人讲 VR/AR,大家回想一下,今天这些人都到哪里去了?这就逼着我们思考两件事情,到底什么是我们真正的创新?什么创新才是人类应该拥有的自信?我在思考这两者之间的关系。我们今天要讲的创新,不是因为 50 年前有人在达特茅斯的会议上提出了一个概念叫人工稚概念,我们就开无数的会来讨论这个概念。今天要讲的创新是,在座的各位去开一个会,能够让 50 年以后的人开很多会来讨论。只有年轻人可以做创新吗?其实我一直在想,年轻人跟年纪大的人到底有什么差别?其实年轻人很了不起的地方在于,他觉得他什么都能干,但是没有说他什么都能干成。这是两件不同的事。可能年轻人明知道干不成,他还要去干,这是一件非常了不起的事情,要有巨大的自信心才可以做到。今天的时代,正好到了一个时刻,需要我们重新想想我们的创新在哪里,我们的智慧在哪里。 Q:您觉得一个好的架构会给人类带来什么好处? A:一个好的架构是包容所有好的技术的一个非常重要的前提。霍金和 Elon Mush 为什么会担心 AI 会毁灭人类,是因为他们不相信人们能够设计出一个好的架构让 AI 好好为人类工作。其实代码也是会出问题的,就是要看有没有一个好的架构能够包容代码的能力,今天这个世界已经远远超出了我们原来的认知。从另外一个角度来讲,今天至少有几个架构是完全没有被人思考的。我在十年以前做云计算的时候,经常说我不知道怎么做云计算,但我知道怎么做飞天(阿里云的核心系统)。今天很多人在研究这个架构,当我设计的时候。有三个最重要的特点:第一、十年前,当所有人都觉得云计算是解决 IT 问题的时候,我们就知道云计算是来解决数据问题,所以那个时候我们就提了以“数据为中心的云计算架构”。但是听起来好像是一句空话,但是你去看我们做的飞天设计就能够知道我们对数据的安全性是放在最底层。 来源:InfoQ 阿里巴巴王坚博士:挑战离年轻人更近,未来才离我们更近 Q:现在有一个说法是算法加数据就等于一切——包括生命本身。您对这种观点什么看法? A:任何东西你只要说到什么加什么是一切的话,肯定是错的。这是肯定的。我今天还想不到一个东西可以包含一切。 这个东西在现阶段非常重要,我觉得这本身是不错的。但算法只是智能很基础的层次,算法能说清楚的东西都还是比较简单的东西。算法说不清楚的东西,语言才能说清楚,所以如果讲语言智能,要比算法智能要好一点吧?算法加数据,在我看来,最多只能说是让传统的计算机科学又有了一次质的飞跃,为传统意义上的软件加硬件的计算机科学的提供了一次巨大的发展机会,我觉得说到这个份上也就也就差不多了。不然我们人类就没有希望了,对吧?折腾了几百年,把事情都折腾完了,下面折腾什么对不对?要给子孙后代留点东西对吧?这是我自己的感受。我觉得作为一个学科也好,作为一个行业也好,作为一个人类也好,能碰上这么一次这么大变化的时代,已经很幸运了。我刚刚大学毕业的时候赶上了软件加硬件的时代,现在又赶上了数据加算法的时代,是很运气的。换句话说,除了这些之外,可能还有一些其他的东西是我不知道的。就像 30 年前我们知道有硬件软件,尽管那个时候有算法的说法,但是大家都不清楚这个东西会给我们带来质的飞跃。所以严格意义上讲,今天只是重新发现了算法跟数据的价值而已,并不是带来什么新的东西。 Q:说到人工智能领域,在您关注的范围内,过去五年哪些发展或者说突破是您觉得非常值得关注的? A:如果是从一个做纯粹做人工智能专业的角度来看,我其实也没那么关注,只是了解一下,主要还是想了解会有什么大变化。我自己觉得,其实人工智能在过去十年已经发生很大的变化,你如果还要发生很大的变化,实际上是很挑战的。任何人随随便便想还有一次非常大的变化,我觉得是可望不可及的,因为一个学科要有一次重大的变化,不知道要积累多少年。大家可以想想,深度学习的东西都是从我们读大学的时候开始积累起来了,对吧?但是倒过来讲,我觉得人工智能本身的发展是可以是巨大的。很多东西其实从理论上也没有突破,但它就是有着蓬勃的发展,比如软件、互联网,这些东西都经历过没有关键突破但是蓬勃发展的时候。所以我自己觉得比较乐观。虽然如果一定要讲到底什么蓬勃发展,我也很难一定说是哪个领域。是无人驾驶?医学图像处理?这不确定的。但有一个是肯定的:今天为什么软件跟硬件大家不再提了?并不是它不重要,是因为它在所有的地方。所以今天为什么人工智能大家说的那么那么重要?就是因为它不在什么地方。我觉得今天的人工智能在我眼里,就好像在中国刚刚修了一条八达岭高速,大家没有感受到 99.9% 的路还没有修。所以我觉得人工智能会蓬勃发展的一个很重要的事情,就是它会到所有的地方。可能十年以后,甚至五年时间,它就会在各个角落。 Q:您觉得经过 60 年的发展,人工智能现在是还在初级阶段吗,还是一个什么阶段? A:我觉得这也是个矛盾的地方。从学科发展角度,它有它的延续性,“好像”是发展了 60 年。但是你认真想想,今天说的人工智能跟 60 年以前不是一回事情——我觉得差别可能远大于集成电路跟电子管的差别。集成电路从原理到机理,其实跟电子管完全不一样,只不过它达到的功能是一样的。集成电路不知道做多少电子管做不到的事情,对吧?电子管只能做那些非常 basic 的事情。现在讲的人工智能跟 60 年的人工智能,从哪个角度讲都不是一回事。现在,它们要达到的目的可能是比较接近的;但再往下搞,就可能连目的都不接近了。所以我觉得从这个角度讲的话,我一直觉得会有更多的新的技术出来帮助我们,但不一定是大家想象的这么延续的发展。 Q:您认为在线数据比离线数据更有价值。这对于人工智能有怎样的意义? A:我觉得这是非常大的意义。严格意义上讲,不应该简单就是一个在线数据和离线数据的差别。这实际上是两个世界的差别。你认真想一下,今天是没有办法离开互联网讨论公司,对吧?大家把互联网当做是一个应用场景,其实不是的。互联网是最最基础的,它不是应用场景,而是所有的应用场景都在互联网上面。所以从这个角度讲的话,今天的智能已经是一个在线智能。今天不可能有一个不在线的智能,就像人死去不可能有智能是一样的。在线这个东西是渗透在每一个环节,它不是说数据在线,智能可以不在线,没有这样的事情。 Q:您觉得我们现在这个时代和历史上的哪个时代最像? A:我不是历史学家。以我的专业,我觉得最近的、最像的一个,就是当年工业革命从英国转到美国的这段时间,跟我们今天这个时代是非常像的。这完全是从技术跟产业的角度。撇开国家这个事情先不说,当时所有的我们今天讲的原创技术,比如说铁路、电、汽车,其实都是在欧洲发明的,都不是在美国发明的。但真正这些事情变成一个改变全世界的事情,是在美国发生的。认真想一下这件事情,对吧?当时只有美洲大陆都通铁路的时候才产生那么大的变化,英伦三岛都通的时候没有发生大变化,因为太小。同样汽车也是:在欧洲,汽车就是汽车。可是到了美国,汽车就变成了新的生活方式。电就更不用说了。所以我想,这是真正的变化的开始,我觉得现在就是这么一个时代。互联网最早的几个原始技术不是在中国发明的,但我想真正的产业革命是有可能在中国完成,因为我们的网络空间要比别人大得多。 这是可以想象的事情。 来源:二叉树 王坚博士,那个行走于现在与未来之间的大顽童 王坚博士的愿景: Q:你认为阿里云最后发展成为什么样的公司?你的理想是什么? A:我觉得阿里云的最高境界一是在世界和中国任何一个不知名的地方都有人在用阿里云、用我们的云计算。二是生活中任何东西都会和计算有关。三是所有的东西都和数据有关。我的理想是什么?我给你讲一个故事,一次去陕西安康出差,在一个小站里看到,两个小孩子在小站里蹭网,因为那里有免费的WiFi。你想想看,过去这两个小孩要走出大山才是他们的未来,而现在有了互联网,他们拥有了一个了解世界的窗口,这世界发生了很大变化,这就是未来,你知道吗? 来源:中国电子报 阿里巴巴CTO王坚:中国可考虑建互联网“特区” Q:您如何看待城市大脑建设? A:城市是人类历史上最伟大的发明,但过去几百年上千年,这项伟大的发明,随着人口的增加、城市面积的扩充、生活形态的改变,已经越来越复杂,有太多的问题已经不能再用过去的方法解决,既有的基础建设,只会让城市的问题越来越严重,而无法真正解决。就如同许多人过去期待互联网可以解决许多人类生活的问题一样,对于当前城市遭遇的问题,不论是交通、治安、生活环境等等,也有许多人期待并努力通过互联网、AI、甚至是区块链技术,解决这些目前看似无解的问题。现在会是发展城市大脑最好的时点,因为关键的要素都已成熟到位,其中三大关键要素包括互联网、数据、云计算。通过这三样准备就绪的要素,城市大脑将得以成熟运作,进而创造出全新的智能。而这三项技术,也同样是当前包括人工智能、机器智能得以落地应用的基础要素。城市大脑最重要的想法,就是在修马路、修地铁以外,还有没有其他方法解决城市的问题?进而让城市出现一个翻天复地的变化?城市大脑最基础的东西,就是我们人类要做的事,中国必须在这里扮演角色,放眼世界,没有人能够解决我们的问题,所以,我们自己解决! 来源:阿里技术 揭开国家AI创新平台“城市大脑”的神秘面纱 Q:您对云计算的看法是怎样的? A:私有云根本就称不上是云,云计算的本质是服务。如果不能够将计算资源规模化、大范围地进行共享,如果不能够真正地以服务的方式来提供,就根本算不上是云计算。IBM等传统IT企业巨头们说的所谓“私有云”,顶多是将其原有的解决方案换汤不换药地新加了点技术、重新包装了一下,卖给用户一个升级版的IT解决方案。如果用户、生态链的思路不转变,如果不能够真正拥抱互联网,那么云是没有意义的。只有当用户、当整个生态链都拥抱了互联网,云计算的价值才会真正凸显。 来源:阿里云 阿里巴巴CTO王坚的 “云和互联网观” Q:您为什么对私有云或者是智慧城市这种名词如此反感?可以说是洁癖吗? A:我倒不是洁癖,但是每个人想法不一样,可能从旁观者来讲是洁癖,但我自己觉得是一个认识的问题。其实本来叫什么名字都没有关系的,张三李四本来就是一样的,但是一旦这个被赋予了张三李四,名字就变得重要。我觉得像智慧城市、像私有云这些东西,别人拿这个东西表达的东西,其实已经不是你想要表达的东西。这时你会有一个很强烈的感觉:这样的认识跟表达会影响你的发展。 它严格意义上不是个洁癖,我自己觉得还是用“眼睛里容不得沙子”会比较好一点。有些技术发展是有超越性的。当它是一个真正意义上的一次很大的跨越的话,那我觉得眼睛里容不得沙子是重要的。不然的话,大家模糊过去,又回到从前了。私有云就让我觉得回到从前了,它给传统的 IT 发展找了一条苟延残喘的理由,这是我自己的理解。 来源:二叉树 王坚博士,那个行走于现在与未来之间的大顽童 Q:您如何看待阿里巴巴未来发展的方向? A:现在,谁要是只谈BAT,那就小看了中国。而且,包括美国的谷歌、微软和Facebook在内,再过五年这些大公司就都变成很小的公司。阿里巴巴其实已经跟其他大公司区分开来,因为其他大公司都要做天下的生意,而阿里是要让天下没有难做的生意。从这个角度讲,以后大公司要活下来,它一定要做其他公司的创新平台,否则就会被挑战甚至淘汰。因为人才跟所有的资源不可能集中到这么一个园区里,最后一定要释放,互联网是创造机会把所有的资源释放出来。生态的概念都要重新想一想,现在很多人做生态,其实还有大小的概念,这是不对的。蚂蚁存在不是因为老虎的恩赐,它天生就存在着,实际上生态是互为生存的基础,所以未来一定是互为创新平台。 来源:搜狐 阿里王坚:为什么未来世界由中国引导而非美国 Q:您如何看待阿里云的云计算布局? A:阿里云不是全球布局,云计算从第一天开始就是全球的,只不过我们今天希望能够提供更好的服务。阿里云的客户已经走出去,需要我们在外提供云服务。我们自然而然就跟出去了。而后,当然也就能服务更多想要出去的企业。很多企业可以约跃过自建阶段,直接入云。云计算从第一天起就是全球的,是伴随互联网而生的,但这不是它的全部。云计算的想象空间更大。当遇到更具想象力的中国市场时,更是会发生神奇的变化。正如很多人没有用过PC而直接使用手机一样,很多企业会没有见过服务器,而直接使用公共云。正如物美从最初送货排长队,到最后通过预约系统只需要10分钟。中国机会更大。 Q:您可以谈一下阿里云的技术观是怎样的吗? A:业内习惯将云计算分为IaaS、PaaS和SaaS的分级,我是最反对分层的。描述云计算最合适一句话是,世界上只有一台计算机。这句话在技术和远见上远远超出了分层的概念。对用户而言,购买计算时,他从来不会想到分级。所以云计算已经将颗粒度大幅提升,服务器不再是硬件,而就是一块砖。用户关注的是房子的实用性,适用性,专修质量,而不会关心材料。所以云计算对技术的影响是很大的,曾经的一些技术会被慢慢被用户遗忘,不再分层。所以,阿里云的愿景是:在这台计算机上,可以跑任何应用。在同一个技术底层上对外提供服务,面向不同服务对象则通过公共云、专有云的方式提供不同的服务窗口,这是真正满足大数据的要求,将互联网做为统一的基础设施。私有云不是一个将互联网作为基础设施的方式,国内的产业界不应再执念于公有云和私有云。开源只是对技术的一种贡献方式。Linux有很多版本对用户而言有很大困难。开源软件还是软件,越底层越要保持一致性。这也是阿里云的技术观,不是开源不开源,而是是否完全一致的服务。正如阿里云将Hadoop全部迁移到ODPS的选择一样,最根本要保证阿里云的技术和服务的一致性。 来源:CSDN 王坚:做底层一致,面向全球的公共云计算服务 开发者社区整理
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 为什么大部分人做不了架构师?这2点是关键 选择有时候比努力重要,真正厉害的人不仅仅是埋头苦干,而是会利用好的思维方式、好的方法,看穿事物的本质,顺势而为,找到事情的最优解,并懂得举一反三。架构师是程序员的目标之一,但大多数程序员无法成为架构师。真正厉害的架构师具备什么样的思维方式,到底强在哪?今天,韩帅为你揭秘。 最强干货 还在为人才短缺头疼?你的公司也许并不需要数据科学家 要解决企业数据应用过程中的挑战,一方面要制定全局的数据战略;另一方面,要选择一款适合于自己的工具。对此,IBM Analyze通过引入大量Watson AI服务,大大降低了企业数据应用门槛,哪怕没有数据科学家,管理者和业务人员也能直观地了解企业管理和运营状态。 这项智能制造技术,竟能为每条产线省下42000美元! 一个不起眼的瑕疵有多么可怕?我们常说,“千里之堤,溃于蚁穴”,并非耸人听闻之言。在高速公路事故统计中,70%的事故由轮胎引起,且在高速行驶下的生还率非常低。而在生产力大幅提升的当下,像这样的产品仅靠人工检测是很难做到的,这就需要运用物联网、人工智能等技术。 专访| 达摩院视觉黑科技创造者华先胜 今天我们来揭秘下“城市大脑”背后的男人之一——华先胜,阿里科学家、城市大脑人工智能负责人、被业界公认为“视觉识别和视觉搜索领域的国际级权威学者”。 ET城市大脑的视觉计算项目,就是华先胜带领做的项目。因华先胜而慕名加入阿里云的人,比他的头衔还要多。陈静远就是其中之一,这位90后计算机博士说,她选择加入阿里云的原因有两个:第一,是ET城市大脑;第二,仰慕华先胜的团队。 每天读本书 开放下载! | 《云端奥林匹克》 奥运会是世界上规模最大的综合性体育盛会,同时也是全球最大规模的跨时间、跨地域、跨语言与跨文化的社会协同。奥运无小事。奥运赛场不能因为计时系统的故障让百米决赛重启、不能因为网络攻击丢失任何有关赛事结果的关键信息、更不能因为交通堵塞改变竞赛日程。而新一代体育迷们对奥运会的诉求显然要远高于上述的基本保障。 精品公开课 Reactive 架构专场(11.21北京站) 著名 Java 布道师 Josh Long(龍之春),阿里巴巴 P9 大佬雷卷从硅谷到中国和开发者亲密接触。 现场解答 Reactor 编程如何使用?阿里云上如何运用 RSocket Broker?RSocket和云原生的关系是什么? 现场学习如何使用 Reactor,RSocket 进行编程。 每日集成开发者社区精品内容,请持续关注开发者必读。
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 给 AI 讲故事,如何教它脑补画面? 视觉想象力是人与生俱来的, AI 能否拥有类似的能力呢?比如:给出一段故事情节,如何让机器展开它的想象力,“脑补”出画面呢?看看阿里AI Labs 感知实验室的同学们如何解决这个问题。 最强干货 解密双十一小程序云背后毫秒级伸缩的Serverless计算平台:函数计算 自2017年第一批小程序上线以来,越来越多的移动端应用以小程序的形式呈现。小程序拥有触手可及、用完即走的优点,这大大减少了用户的使用负担,使小程序得到了广泛的传播。在阿里小程序也被广泛地应用在淘宝/支付宝/钉钉/高德等平台上,例如今年双11大家在淘宝/天猫上参加的活动,大部分都是通过小程序提供的。 每秒8700万次!数据库峰值新纪录背后的关键力量 2019年双11,阿里云自研云原生数据库POLARDB创造了每秒8700万次的数据库处理(TPS)峰值新记录。眨眼间,即完成了8700万次计算。 在阿里云双11技术媒体发布会上,阿里云智能数据库事业部总经理曹伟表示,在阿里自研数据库产品POLARDB以及其他多款数据库产品的共同支持下,今年双11开始前15分钟整个系统没有任何抖动,确保数亿用户顺畅购物。 5G对于云边协同发展前景的影响 从云管端三个层次来看,5G作为工作于网络层的通信技术,其发展和运用能够大幅度提高云端和边缘端的沟通效率。虽然边缘计算终端能够为云平台分解一部分计算压力,但是由于网络层的限制,实时性是云边沟通协同中的主要限制,5G的运用使边缘计算能够通过传输速度的加快克服其本身计算力较弱的特点,使边缘计算的作用从目前更靠近感知层而逐步北向真正融入平台层,真正起到其应是具有计算力的前端节点的作用。 每天读本书 点击下载——《智能时代的传媒变革与发展》 中国的数字电视用户从345万到1.88亿的增长,共用了10年时间;而直播平台用户从0到1.5亿,只用了2年。移动互联网的发展红利还未褪去,大数据、AI、VR、AR等新技术又在传媒领域颠覆行业的基本认知。 今天的传媒行业,颠覆传统模式的不是内部的竞争,而是外部的挑战。当所有人都在一步步进入数字化和精细解析的社会,基于数据的解构准确感知消费者的内容精神需求,大幅优化企业内容生产、供给、运营和消费流程,实现基于真实消费者心理需求的柔性内容生产和柔性供给,就成为了传媒行业数字智能化变革的核心。 精品公开课 智能机器人走进我们的生活 海底捞智慧智慧火锅餐厅的送餐机器人让我们感受到了智能化时代的到来,到底是什么让机器人为人类实现贴心服务的呢,激光雷达、机器视觉等先进的智能技术 ,11月20日,一起走进擎朗、看看他们是怎么做到的。 每日集成开发者社区精品内容,请持续关注开发者必读。
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 独家下载 |《大数据工程师必读手册》揭秘阿里如何玩转大数据 十年磨一剑,今天的飞天大数据平台是阿里巴巴10年大数据平台建设最佳实践的结晶,是阿里经济体大数据生产的基石。飞天大数据平台承载了阿里经济体 99% 的数据业务构建,同时广泛应用于城市大脑、数字政府、电力、金融、新零售、智能制造、智慧农业等各领域的大数据建设。 最强干货 快!5分钟快速完成监控系统搭建之实践篇 监控告警系统是每一家企业都需要的系统。系统的监控运维告警可以帮助企业快速发现系统故障,定位故障和处理故障,对企业业务稳定性起到至关重要的作用。业务监控系统可以实时进行业务告警,进行业务趋势的分析和判断,对于数据化运营起到重要的帮助。 中国数据库OceanBase登顶之路 今年天猫双11当天,OceanBase数据库再次刷新数据库处理峰值,达6100万次/秒,创造了新的世界纪录。 在此之前一个月,据权威机构国际事务处理性能委员会TPC披露:蚂蚁金服的分布式关系数据库OceanBase,打破美国甲骨文公司保持了9年的世界纪录,成为首个登陆该榜单的中国数据库系统。 前端面试宝典 | 100+面试题200+书籍推荐 前端面试考点众多,而网上各个知识点的博客文章又太多,看的眼花缭乱……所以便整理了一下常见知识点的精华文章,干货集锦以及面试合集、推荐读物。也欢迎大家推荐精华文章,大家共同学习进步! 每天读本书 开放下载! | 《AI时代下的汽车业数字化变革》 如今的汽车业早已不是过去的江湖。工业时代所建立的百年游戏规则,进入到数字时代正快速被打破。汽车与交通、零售、电商、互联网、高科技等行业边界的模糊化,越来越多的车企开始“不按常理出牌”,企业间的竞争维度变得模糊与多元。云计算、物联网、5G、人工智能、自动驾驶、区块链等数字技术,正在重构企业对研发、生产、营销与服务的认知。 精品公开课 带您走进开为科技,一起去了解AI赋能传统零售的故事 开为科技作为赛道明星班的成员,一直致力于用FaceID打造零售大数据中台、无感会员识别与AR精准互动营销,为客户搭建运营及商业化体系。让我们一起跟随COO杨宽先生去了解AI如何赋能传统零售?如何占据收银台等黄金流量入口?如何实现全场景、全渠道的千人千面精准营销? 每日集成开发者社区精品内容,请持续关注开发者必读。
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 写1行代码影响1,000,000,000人,这是个什么项目? 不带钱不带卡,只带手机出门就能畅行无阻,这已是生活的常态。益普索发布的《2019第一季度第三方移动支付用户研究》报告显示,移动支付在手机网民中的渗透率高达95.1%,截至今年1月,支付宝全球用户数已经突破10亿。你或许每天都会打开支付宝,付款购物、领取权益、享受服务……但你或许不知道的是,在这个方便、快捷、智能化的APP背后,有一群年轻的技术人,用智慧和创新让它每天都变得更“聪明”一点。 最强干货 微服务架构四大金刚利器 互联网应用发展到今天,从单体应用架构到SOA以及今天的微服务,随着微服务化的不断升级进化,服务和服务之间的稳定性变得越来越重要,分布式系统之所以复杂,主要原因是分布式系统需要考虑到网络的延时和不可靠,微服务很重要的一个特质就是需要保证服务幂等,保证幂等性很重要的前提需要分布式锁控制并发,同时缓存、降级和限流是保护微服务系统运行稳定性的三大利器。 从P4到P9, 在马云家写代码到双11前端PM 今年的双11已经是阿里资深前端技术专家舒文来阿里的第11年,从应届生到双11前端PM,他一路升级打怪,实现了岗位上从P4到P9的晋升。这第11届双11顺利结束之际,他把在阿里这些年的成长经历做一个总结和分享,希望你能在他的故事中得到些许启发。 高精地图中地面标识识别技术历程与实践 本文将主要介绍高德在高精地图地面标识识别上的技术演进,这些技术手段在不同时期服务了高精地图产线需求,为高德地图构建高精度地图提供了基础的技术保证。 每天读本书 开放下载! | 《新一代数字化转型白皮书》 我们正在进入一个高速变革的时代,新技术的进展和中美关系的变化,进一步增大了商业环境的不确定性。传统的信息化和经典的战略观已经不能适应数字业态的需要。企业如何创新存活、如何突破业务增长的极限,成为了众多企业家关注的焦点问题。在数字化的商业形态和生产运营方式下,数据成为企业最核心的资产,必须设计出与数字化技术相匹配的战略模式和机制,才能保证数字化转型的成功。 精品公开课 阿里巴巴研发效能实践日——北京站 阿里巴巴研发效能实践日是阿里巴巴研发效能部主办的线下沙龙活动品牌,活动将联合业内优质的社区、企业等,为大家带来研发效能的最新理念、方法以及最佳实践。 本次研发效能实践日,由阿里云 Teambition 和全球领先的项目管理协会PMI联合主办,,我们为大家准备了4个主题演讲,期望能给你带来思维上的启发、并能实际应用到工作中。 每日集成开发者社区精品内容,请持续关注开发者必读。
点击这里 免费下载《5G+AI 阿里文娱技术实践》 全新电子书《5G+AI 阿里文娱技术实践》正式上线!如何用技术带给用户更加流畅且个性化的体验,这是阿里文娱一直在突破的关卡。本书将通过窄宽高清革新、大麦物联网技术、6DoF视频技术等5大板块,带你全面了解阿里文娱独具魅力的思考。 精彩导读 从1.0到3.0,窄带高清的技术演进路线解读 早在2015年,阿里巴巴就提出窄带高清概念。这个概念一经提出,就被行业及视频厂商引用,并且类似服务开始涌现。9月27日,在2019杭州·云栖大会【智慧文娱技术】分论坛上,优酷带来了行业关注已久的窄带高清3.0。在5G大趋势下,优酷加速布局智能高清,意在通过技术创新,让更多用户享受普惠高清服务。 窄宽高清是如何如何实现的?它从哪些角度提高了观众的体验感?全新的3.0版本又有哪些新的突破?答案就在书中! 内容全生命周期里的文娱大脑 文娱内容不同于其他商品,很难有完整的量化指标体系,而内容的复杂性决定了文娱产品的不确定性。我们如何利用AI+大数据能力,建造文娱的内容认知大脑?串联内容全生命周期,实现对内容、流量、宣推等的“未卜先知”,提升对爆款的预测和生产能力?看阿里巴巴文娱事业群资深算法专家蔡龙军为你详情揭秘。 5G下的6DoF视频技术,到底有何不同? 5G时代,视频内容形态将迎来三个趋势:一是依托5G的大带宽,超高清视频将真正落地;二是沉浸式视频迎来发展,但如同《头号玩家》所描述的,沉浸式视频体验是人类感官消费的最终形态,还有很长的路要走;三是交互式视频,包括3D视频、AR形态视频、游戏化视频,以及借由AI赋能的新视频消费方式。优酷在这些领域都在布局,希望借助技术创新,引领用户观看体验的提升。 本章将为你介绍6DoF视频背后的技术秘籍,深度交互式体验触手可及! 大麦物联网技术的实践之路 这是一个万物智联的时代,是AI技术和物联网相结合的时代,这一章节将主要介绍IoT技术在大麦现场服务部分的应用。 大麦现场服务平台,分为设备端和服务端两部分。端上设备的一大特点就是碎片化非常严重,因此如何标准化是一大挑战。另外端基础能力,如物联网及安全等技术能力的建设也是重点;而5G时代的来临,使得未来的现场娱乐设备更加值得期待。 大数据赋能电影数智化宣发 电影宣发正在从传统线下走向互联网,传统线下和互联网的宣发预算投入,由原来的以线下为主,转变为线下和互联网预算比例为1:2。好的宣发能为电影票房打下非常好的基础,助力电影口碑快速发酵,并下沉到三四线的市场。 由于电影宣发的长链路和环节的复杂性,在数据化的进程中,我们遇到不少难题。最后这个章节将从电影的互联网化、宣传和发行环节,为你全面解读数智化宣发。 更多免费精品电子书,点击这里 立刻获取!
2019天猫双11成交额2684亿! “不是任何一朵云都能撑住这个流量。中国有两朵云,一朵是阿里云,一朵叫其他云。”11月11日晚,阿里巴巴集团CTO张建锋表示,“阿里云不一样,10年前我们从第一行代码写起,构建了中国唯一自研的云操作系统飞天。” 阿里巴巴集团CTO、阿里云智能总裁张建锋 2019天猫双11再次刷新世界纪录,订单创新峰值达到54.4万笔/秒,单日数据处理量达到970PB。今年阿里巴巴核心系统100%上云,撑住了双11的世界级流量洪峰。 “阿里巴巴是一架高速飞行中的飞机,我们成功在此过程中换上了全新的引擎。”张建锋说,用公共云来承载这样一个万亿规模的核心系统,阿里云是第一个做到的,“很多云厂商自己的业务系统,不在自己的云上,今后阿里全部系统都在阿里云上。” 阿里巴巴是全球首家将核心系统100%运行在公共云上的大型互联网公司。 附:张建锋演讲核心观点 从去年开始,我们决定把整个阿里巴巴核心系统全部上云,上云还要加一个定语,是上“阿里云”,并不是上任何一朵云都能撑得住这个流量。在中国,我们经常说中国有两朵云,一朵叫做“阿里云”,还有一朵叫做“其它云”。 为什么讲阿里云跟其它云不一样?因为在中国只有阿里云是完全从头研发的一朵云,从头是从每一行代码,从十年前开始写,今年是阿里云的第10年,所以我们的云有一个特别的名字,叫做“飞天操作系统”,当初王坚博士创办阿里云的时候,对我们这个云下面的调度系统,整个云的基础平台,取名叫做“飞天操作系统”。 我们的云完全是中国自研的一朵云,其它很多云从开源软件改造过来的,这是非常大的不一样。 第二个,今年双11,阿里仍然是一家在高速飞行中的飞机,我们成功的在这个过程中换上了全新的引擎。以前大家把非核心负载放在云上,现在阿里巴巴最核心的系统放在了云上。现在我们的云把原来专用的技术变成公共云,大家都可以来享受普惠服务。我们有最好的系统,你们也可以在上面跟我们一样使用。 阿里云承载阿里巴巴自己100%的核心系统,这个是我们全球第一个做到的。很多云厂商自己也有业务系统,但是自己的系统不在自己的云上。我们以后所有阿里系统全部都在阿里云的飞天操作系统上面。 大家一定会想,这是一个简单的替换还是技术上非常大的一个进步、非常大的挑战?我简单说一下,我们有几个方面做得非常好,它不是简单的替换,上云之后性能有了一个非常大的提高。 今天大家可能有感觉,我们前十分钟,基本上消费者没有感受到任何抖动,大家购物非常顺畅。 第一、我们在核心虚拟机系统上,自研神龙架构,用自研的服务器来做虚拟化。一般的服务器随着压力增长,最终负载能力会慢慢下降,它不是线性的。我们神龙服务器压力越大,输出也是非常线性的,这是非常难做到的。 第二、我们自研了云原生的数据库。今年有两个数据库,一个是自研的OceanBase,大家知道我们在TPC-C测试里面拿下了全球第一。第二是PolarDB,也广泛用在这次双11上,没有任何问题,我们每秒峰值也是远远超越于原来Oracle这样传统的数据库。 第三、我们的计算与存储做了分离,现在阿里巴巴存储是有一个地方专门存数据。数据都是从远端存取的,所以存储可以很方便的扩容,因为它有一个专门的池。原来做不到。因为原来远端存储,访问网络速度就跟不上。 第四、之所以现在能够做到在远端存储,能够比本地读写磁盘更快,是因为我们做了RDMA网络,这是全球第一个大规模做RDMA网络的公司。 我们这四个方面都做了核心突破。 今天,飞天操作系统能够在10万台级别以上的服务器里面做调度,今天双11有非常多的应用,但是它并不是说每一个时间点,所有应用负载都是一样的。我们在零点把大部分计算机资源分配给交易等应用,过了一点之后,我们把数据分配给数据处理系统。数据处理今年创了一个新高,2017年当天处理了300PB的数据,2018年处理了600PB的数据,今年要处理970P左右的数据。 大家可能没有概念,一个P到底有多少数据,我上次跟央视的人交流,央视拍了这么多年电视新闻节目,几十年下来他存了大概80P的数据。双11一天,我们要处理970P的数据,非常大的量,没有一个先进的系统是撑不住的。 第二个是非常实时,大家看到了,今天在秒杀,在会场全部都是个性化、千人千面的,这里的数据不仅是大,而且是要做到非常实时。到目前为止,我们菜鸟物流系统已经产生了超过10亿笔的物流单,这个数据还在很快的上涨,这些都需要依靠阿里云背后大量的计算能力。 我们今年的数据,除了批处理之外,还有流处理,就是实时处理所有数据,就像你们看到的交易数据,每分钟、每秒钟都在变,它并不是从数据库里面统计出来的,它是每生成一笔订单,系统自动一层层把数据汇集上来。我们这个系统每秒能处理25亿笔记录,这是流式的系统。 我们这么多服务器,要把它全部管理起来,除了飞天系统之外,还要管理所有的消息流转,所以我们自己开发了一个叫做MQ的消息系统,这也是全球目前最大的一个消息系统。 今天,从飞天系统、大数据处理平台到智能化应用,这些技术叠加起来打造了一个新的分布式的基于云的平台,才使得阿里整个经济体所有核心应用都能够跑在上面。 最后,我们今年发布了自研的芯片含光800。明年双11,阿里大量人工智能应用都会跑在自研芯片上面。 今天从飞天云操作系统到神龙服务器、数据库、交换机、交换机操作系统、RDMA网络,全部是阿里自研的。我们今天已经积累了非常丰富、非常强的能力,从硬件、数据库、云计算操作系统,到上面的核心应用平台,四位一体,这是这次双11跟往年最大不一样的地方。 所有不可想象,终将化作寻常;我们相信“相信”,一切都是新的。双11快乐!
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 今晚为阿里工程师疯狂打call! 2019 天猫双1196秒成交额破100亿全球最大流量洪峰每秒订单峰值54.4万笔阿里巴巴核心系统100%上云我们扛住了! 最强干货 带你上手一款下载超 10 万次的 IDEA 插件 Cloud Toolkit 是本地 IDE 插件,帮助开发者更高效地开发、测试、诊断并部署应用。通过插件,可以将本地应用一键部署到任意服务器,甚至云端(ECS、EDAS、Kubernetes 和 小程序云 等);并且还内置了 Arthas 诊断、Dubbo工具、Terminal 终端、文件上传和 MySQL 执行器等工具。 Spotify如何使用Cassandra实现个性化推荐 在Spotify有超过6000万的活跃用户,他们可以访问超过3000万首歌曲的庞大曲库。但有时丰富的选择也让用户感到些许困惑。如何从超过10亿个播放列表中找到适合锻炼时听的播放列表?Spotify着手建立了一个个性化系统,它可以分析实时和历史数据,分别了解用户的场景和行为。随着时间的推移和规模的扩大,我们基于一套灵活的架构建立了自己的个性化技术栈,并且确信我们使用了正确的工具来解决问题。 Apache Flink 为什么能够成为新一代大数据计算引擎? 大数据时代对人类的数据驾驭能力提出了新的挑战,Flink 的诞生为企业用户获得更为快速、准确的计算能力提供了前所未有的空间与潜力。作为公认的新一代大数据计算引擎,Flink 究竟以何魅力成为阿里、腾讯、滴滴、美团、字节跳动、Netflix、Lyft 等国内外知名公司建设流计算平台的首选? 每天读本书 带你读《中台战略:中台建设与数字商业》之二:云智慧时代的数字营销 在产业互联网时代,数字化成为企业的核心战略。在此背景下,数字中台成为指导企业数字化转型、实现数字营销的主流方法。数字中台是基于企业级互联网及大数据架构打造的数字化创新平台,包含业务中台和数据中台。 精品公开课 日志数据如何同步到MaxCompute 2019大数据技术公开课第五季系列课程!本次直播将主要讲解日志文件如何通过Loghub/Datahub同步数据到MaxCompute的参数介绍和详细同步过程等内容。 每日集成开发者社区精品内容,请持续关注开发者必读。
系列文章点击查看:深度回顾!30篇好文,解析历年双十一背后的阿里技术秘籍 | 双11特别策划之一 2019 天猫双1196秒成交额破100亿全球最大流量洪峰每秒订单峰值54.4万笔阿里巴巴核心系统100%上云我们扛住了!(文末有精彩) > 2684亿!阿里CTO张建锋:不是任何一朵云都撑得住双11 < 阿里巴巴是全球首家将核心系统100%运行在公共云上的大型互联网公司。 “不是任何一朵云都能撑住这个流量。中国有两朵云,一朵是阿里云,一朵叫其他云。”11月11日晚,阿里巴巴集团CTO张建锋表示,“阿里云不一样,10年前我们从第一行代码写起,构建了中国唯一自研的云操作系统飞天。” 2019天猫双11再次刷新世界纪录,订单创新峰值达到54.4万笔/秒,单日数据处理量达到970PB。今年阿里巴巴核心系统100%上云,撑住了双11的世界级流量洪峰。 阿里巴巴集团CTO、阿里云智能总裁张建锋 “阿里巴巴是一架高速飞行中的飞机,我们成功在此过程中换上了全新的引擎。”张建锋说,用公共云来承载这样一个万亿规模的核心系统,阿里云是第一个做到的,“很多云厂商自己的业务系统,不在自己的云上,今后阿里全部系统都在阿里云上。” 》点击这里查看精彩演讲《 这项“不可思议”的挑战背后是众多阿里“黑科技”的支撑,究竟是哪些技术撑起了如此强大的流量洪峰?今年的双11阿里又有那些全新的突破呢?下面这些文章将带你揭秘 2019天猫双11 背后的那些奥秘! 6大黑科技造就全新双11,为阿里工程师疯狂打call! 2019是阿里技术人面对的第11个双11,因为技术突破,他们更加从容。每一年双11破纪录的交易额背后,是更多世界顶尖技术的诞生。今年,阿里园区是五彩斑斓的,技术却是“黑”的。今年双11有哪些黑科技?分别是哪些技术上的新突破?且听阿里妹细细道来。 支付宝技术双11答卷:没有不可能 1分36秒100亿,5分25秒超过300亿,12分49秒超500亿……如果没有双11,中国的互联网技术要发展到今天的水平,或许要再多花20年。双11向来都是支付宝新技术的最佳演练场,而今年无论是Service Mesh搭建的全球最大金融级云原生集群,还是Geabase在花呗图计算上的应用,都是实现“中国速度”的基石。 淘系技术,实力为2019年双11而战!稳! 天猫双11,已经不仅是购物节,也是品牌成长节、消费者互动节。天猫双11更是是商业的奥林匹克。今年,双11走到了第11个年头,史无前例的,阿里经济体内有49支技术团队共同参与作战,也是第一次,双11的核心系统将100%跑在云上,这无疑让今年的双11技术作战充满了更大的挑战。 每秒54.4万笔!双11全球最猛交易洪峰背后的数据库硬核科技 全球最大流量洪峰:每秒订单峰值54.4万笔!阿里云自研云数据库产品家族首次全面参与双11。惊人的数字及顺利剁手的背后,离不开稳如磐石般的阿里云数据库技术,年度“大考”的成绩单如何?让我们一起来看看吧! 2019双11,阿里云视频云的 “成绩单”! 无论是大牌明星云集极致视听效果的猫晚,还是网红扎堆全民皆可带货的淘宝直播,狂欢的背后,是技术的孜孜以求!从SRT+杜比全景声直播、超低延时直播、NGCodec 4K 265实时转码到第三代拥塞控制的TCP算法,以及智能弹性调度,目的就是为了给更户带云更流畅、更实时、更真实的直播购买体验。 双11解决方案应用全揭秘 纵观往期双十一的交易数据,我们不难发现,双十一为商家带来流量曝光和推广的同时,高频度流量也对企业数据库处理等能力提出了更高的要求。今年双十一阿里又使用了什么样的数据库容灾模式呢?双中台营销方案和全链路压测又是如何部署? 独家揭秘 | 阿里怎么做双11全链路压测? 全链路压测是阿里的首创,我们将从工作内容、操作过程、运行总结等多个方向来介绍下阿里内部典型电商活动(如双11准备),以给大家展示一个完整的压测流程,帮助更多的企业和用户更好的完成性能测试。 和过去10年一样,2019年天猫双11又创造了一个全新的纪录。最后,为数代支付宝和阿里巴巴的工程师们殚精竭虑、不断突破的精神献上超燃纪录片《一心一役》,为大家讲述这一路走来的那些隐秘往事,以及双11中支付宝那些“不为人知”的秘密。 >> 超燃!支付宝技术双11纪录片《一心一役》全球独家首发 <<
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 测试工程师不懂AI,还有未来吗? 近几年人工智能、机器学习等词漫天遍地,似乎有一种无AI,无研发,无AI,无测试的感觉。有人说:不带上“智能”二字,都不好意思说自己是创新。我们先暂且不评论对错,只探讨这背后值得我们思考的问题。在测试领域,人工智能和测试是什么关系?为什么测试领域会谈及人工智能?如果测试工程师不懂AI,是否有未来,测试人员该如何看待“AI测试”?在软件质量保障中到底应该如何循序渐进的切入这一话题?业界在此领域目前现状是怎样?带着这些问题,阿里高级测试开发专家汪维希望借此和大家做一些交流和探讨。 最强干货 GitHub重磅年度报告:4000万程序员最爱开源项目和编程语言排名出炉! 全球最大开发者社区GitHub今天重磅发布2019年度报告:GitHub目前在全球已有超过4000万开发者用户,其中80%来自美国之外的地区。此外,JavaScript仍然是使用人数最多的语言,但史上第一次,Python击败Java排名第二。 饿了么交付中心语言栈转型总结 饿了么并入阿里集团,为了能高效与集团内部系统协同对接,同时方便利用集团优势技术资源,更好的融入阿里集团技术生态圈,饿了么交易中台在上半年启动了交易领域的四大应用语言栈转型项目,为阿里集团本地生活服务平台打好技术平台基础做准备。另外,随着业务量的激增,饿了么平台支持的品类不仅仅是最初的外卖单品,整个交易中台也需要一次相对大的重构来快速应对复杂多变的业务需求。而本文中的交付中心即是饿了么交易领域四大应用之一。 如何做到测试场景不遗漏? 每一次提测就像一次质量问题的万箭齐发,稍不留意,中个一两箭算是小事,乱箭穿胸那也是经常的。如何做到无懈可击,仅仅靠闪是不够的。这个时候,测试分析,可以帮助你。通过对业务、经验、质量的深度理解和分析,结合测试工具,可以让你在这漫天箭雨中,有条有理,从容不迫,闲庭信步。 每天读本书 带你读《中台战略:中台建设与数字商业》之一 在产业互联网时代,数字化成为企业的核心战略。在此背景下,数字中台成为指导企业数字化转型、实现数字营销的主流方法。数字中台是基于企业级互联网及大数据架构打造的数字化创新平台,包含业务中台和数据中台。 精品公开课 走进“阿里云创新中心(无锡高新)基地 ” 本次直播将从三方面直观阐述阿里巴巴创新中心x律兜的创业扶持计划,主要包括,阿里巴巴创新中心简介、律兜互联网法律服务平台简介以及企业法务助手等互联网法律产品亮点。“互联网+法律”领域聚焦于利用互联网来推进法律服务便捷化、高效化、低价化发展,并取得了各界的广泛关注并萌发了一批具有潜力和增长空间的项目,如果你看好互联网法律这个行业,千万不要错过这次直播! 每日集成开发者社区精品内容,请持续关注开发者必读。
系列文章点击查看:96秒100亿!哪些“黑科技”支撑全球最大流量洪峰?| 双11特别策划之二 一年一度的剁手日即将到来! 在双十一庞大的数据处理量面前,用户在使用感上却丝毫不受影响。阿里技术团队通过不断的探索,在交易洪峰面前仍然保障着系统丝般顺滑地运行。世界纪录的背后究竟有哪些技术支撑?今天我们将从 云计算、新零售&支付、安全 和 物流 四大方向带给大家双十一技术全解密! 云计算篇: > 剖析AliSQL X-Cluster|基于X-Paxos的高性能强一致MySQL数据库 MySQL数据库从诞生以来就以其简单、易用、开源为其主打特点,成为不少开发者首选的数据库系统。 > 直击阿里双11神秘技术:PB级大规模文件分发系统“蜻蜓” 蜻蜓,通过解决大规模文件下载以及跨网络隔离等场景下各种难题,大幅提高数据预热、大规模容器镜像分发等业务能力。月均分发次数突破20亿次,分发数据量3.4PB。其中容器镜像分发比natvie方式提速可高达57倍,registry网络出口流量降低99.5%以上。 > 技术如何秒懂你?阿里百万级QPS资源调度系统揭秘 TPP(Taobao Personalization Platform, 也称阿里推荐平台 ) 平台承接了阿里集团300+重要个性化推荐场景,包括手淘首页猜你喜欢、首图个性化、购物链路等。除了提供应用层面的支持和封装,还肩负着机器分配和维护各场景运行稳定的重任。 > 双11黑科技,阿里百万级服务器自动化运维系统StarAgent揭秘 还记得那些年我们半夜爬起来重启服务器的黑暗历史吗?双11期间,阿里巴巴百万量级主机管理能安全、稳定、高效,如丝般顺滑是如何做到的?这归功于StarAgent,它可以当之无愧的说是阿里巴巴IT运维的基础设施。 > 独家揭秘 | 阿里怎么做双11全链路压测? 全链路压测是阿里的首创,我们将从工作内容、操作过程、运行总结等多个方向来介绍下阿里内部典型电商活动(如双11准备),以给大家展示一个完整的压测流程,帮助更多的企业和用户更好的完成性能测试。 > 直击阿里新一代数据库技术:如何实现极致弹性能力? 张瑞,阿里巴巴研究员,阿里集团数据库技术团队负责人,经历阿里数据库技术变革历程,连续六年作为数据库总负责人参与双 11 备战工作。这篇文章将分享新一代数据库技术在双 11 中的应用。 > 阿里发布品牌数据银行!能像货币一样储蓄和增值 2017年6月7日,阿里巴巴集团正式发布服务于品牌的消费者数据资产管理中心——品牌数据银行(Brand Databank),将帮助品牌建立全面的消费者数据资产管理,是国内首个实现品牌全域数据资产管理的平台。 > OceanBase实践入门:高可用原理和容灾方案 OceanBase的高可用可以做到自动故障切换和不丢一点数据,即使是异地多机房部署也是如此。这是OceanBase的特性之一。OceanBase的高可用机制是数据库内核能力不可分割的一部分,且是常态运行不存在需要的时候才发现失效了。 > OSDI '18重磅解密:蚂蚁金服实时金融级分布式图数据库GeaBase GeaBase是具备高性能、高可用、高扩展性及可移植性强的实时金融级分布式图数据库,广泛应用于蚂蚁金服风控、社交、推荐等技术场景。“过无人区” 、“Made in China” 、“反哺”是GeaBase的几个耀眼标签。每年的支付宝春节红包、每一笔交易的反洗钱识别等等,背后的技术都少不了它的身影。 > 数据中心日均 CPU 利用率 45% 的运行之道--阿里巴巴规模化混部技术演进 混部技术的出发点,源自于对不断增长的业务和日益攀升的资源成本如何平衡的思考,我们希望用最小的资源成本,支撑更大的业务需求。是否能够复用已有的存量资源,来满足新增的业务,这就是混部技术发展的思想源头。 > 阿里云弹性计算ECS 阿里云ECS可以在5分钟内支付一个中型互联网公司规模的计算平台,助力平稳承接双十一期间数十倍甚至百倍于平时的业务数据量。用户的每一次点击浏览背后都有ECS提供高性能、稳定算力的支撑。 > 阿里云数据库RDS 大促期间,商家订单量较平时提高数十倍甚至百倍,RDS的灵活弹性升级能力帮助商家瞬间提升RDS能力,应对并发订单流量。 > 阿里云内容分发网络CDN 将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点播、直播等场景。 新零售 & 支付篇: > 20万天猫智慧门店背后的商业思考和技术重构 如何助力零售企业完成数字化转型,用大数据和云计算的力量帮助品牌更好地洞察消费者、连接消费者、服务消费者,是一个重要的课题。 > 时尚电商新赛道:揭秘 FashionAI 技术 “今天吃什么”依旧每天困扰着我们,但“今天穿什么”的问题,阿里巴巴想通过技术来帮我们解决。阿里巴巴 FashionAI 时尚大脑,借助 AI 技术,为我们提供服饰搭配的参考方案,这也是阿里一直强调的“新零售”的具体体现之一。 > 新零售浪潮下,人货动作如何数字化? 本文讨论其中的三个关键的技术点:基于图像的顾客动作检测算法;基于射频信号的商品翻动检测算法;基于二部图匹配的人货关联算法。 > 如何用人机协同提高客服效率?阿里巴巴客服助手诞生了 阿里巴巴经济体每天都在服务着数以亿计的会员,每天会员求助的进线量巨大,尽管机器人的解决能力已经很强大,但是以目前技术人工客服依然无法完全被替代,庞大的阿里人工客服在保障会员体验的任务中仍扮演着十分重要的角色。阿里巴巴新零售技术事业群-CCO技术部打造了一款助手在客服工作中予以辅助,实现人机协同。 > 如何解决移动电商平台中的“伪曝光”? 在线推荐服务根据商品的特征和用户的信息推荐多个商品。 现如今很大比例的用户通过手机访问电商平台。 但是一些推荐的商品并没有被用户看到。为了解决在线推荐场景中的伪曝光问题并提高推荐商品的CTR,我们首次尝试了bandit框架,并且在传统的bandit算法上进行了多项改进,取得了不错的效果。 > 为电商而生的知识图谱,如何感应用户需求? 本文从需求分析和体系化构建的角度出发,阐述在电商这一特殊领域的知识图谱构建过程中,形成的一整套概念体系,还有在此过程中,通过算法、工程、产品、运营和外包团队投入大量精力,通过不断磨合逐渐完善的平台架构和审核流程。 > 如何增加用户的参与感?交互式推荐来了! 一方面,互动能让用户感受到更多的参与感,并能一定程度上干预推荐结果,而不只是被动接受推荐结果;另一方面,系统通过与用户的互动能更加了解用户的偏好,从而提升推荐效果。那么,我们是如何让用户和推荐系统互动起来的呢?且看下文。 > “为你推荐”背后的算法探秘 我们希望营销场景作为卡片的形式插入到现有的为你推荐里,一方面是为这些场景分发流量,一方面是希望提高整体的坑位曝光收益。今天,我们就来探秘如何插入这些营销场景卡片。 安全篇: > 异常检测的N种方法,阿里工程师都盘出来了 互联网黑产盛行,其作弊手段层出不穷,导致广告效果降低,APP推广成本暴增。精准识别作弊是互联网公司和广告主的殷切期望。今天我们将从时间序列、统计、距离、线性方法、分布、树、图、行为序列、有监督机器学习和深度学习模型等多个角度探讨异常检测。 > 揭秘阿里云WAF背后神秘的AI智能防御体系 阿里云WAF AI内核为云WAF提供核心机器智能能力,为客户提供精细化个性化智能化的防护,最大程度降低安全风险。AI驱动的智能安全系统趋势明显,所带来的收益也会越来越大。 > 阿里云安全肖力:云上数据安全体系建设的六要素 高等级的云上数据安全体系到底是如何做的?6月29日,在第二届数据安全峰会上,阿里云智能安全事业部总经理肖力给出了答案。肖力指出,云上数据安全建设是一个系统工程,最主要的六大方面是减少攻击面、正确的产品安全策略配置、统一的身份认证授权、数据加密、数据防泄漏、日志审计。 > 阿里安全工程师首度揭秘智能风控平台MTEE3 “太刺激了,太刺激了!如果那个48%真出问题,整个安全部的双11就可能是3.25!”阿里安全业务安全产品技术高级专家知命推了推眼镜。MTEE3是什么?那个48%又是什么鬼? > 阿里安全技术平台资深专家玄泰解密:“如何防止信息泄露” 近年来,大规模的个人信息泄漏事件不断发生,由此引发的精准诈骗也经常被媒体报道。有着庞大用户群体和海量交易的阿里巴巴却能独善其身,这背后有什么独门秘籍呢?阿里安全技术平台资深专家玄泰反复提到“御城河”三个字。 > 转账的 0.1秒,支付宝对你做了什么? 0.1 秒能做什么?眨一下眼睛,或者什么也干不了? 对于蚂蚁神盾局来说,0.1 秒内要做的事太多了,它能在0.1秒内检测诈骗,盗号甚至非法集资,这个看似不太可能的任务,他们依靠了一个秘密武器 —— CTU智能风控大脑。 物流篇: > 菜鸟双11“十亿级包裹”之战 本文将主要从包裹预测、供应链入库、订单下沉、订单路由调度、电子面单及智能分单,以及在末端小件员方面的一些技术探索实践,通过数据和技术的力量,捍卫这场十亿级包裹的双11之战。 > 首次公开!菜鸟弹性调度系统的架构设计 在弹性调度出现之前,菜鸟整体资源使用率都处于一个比较低的水平,对于菜鸟来说,弹性调度是提升资源使用率最为行之有效的一种方式。方舟平台提供了可靠、高效的扩缩容能力,真正意义上实现资源的“按需使用”。 看完了如此详细的解析,大家一定需要一套实践方法论。这里有一篇深度好文: 双十一解决方案应用全揭秘 ,这套解决方案将选取以往双十一期间出现频率较高的一些问题(如:大促流量高峰无法应对、数据意外丢失,无法及时恢复、获客难,会员营销如何更智能及企业内部沟通如何更安全更高效等)提出切实可行的解决方案,为大家分享阿里巴巴实践经验及产品化解决方案,并提供爆炸式支付增长的保障。 2017年天猫双十一全栈技术架构图
从0到千万DAU,闲鱼架构如何演进?政务钉钉如何帮助政府打造组织中台?视障用户如何盖楼抢双十一红包?……最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 从0到千万DAU,这5年闲鱼架构如何演进? 闲鱼品牌创立于14年阿里的某个茶水间,从0开始到现在千万DAU,5年时间里闲鱼见证了闲置物品从线下到线上交易的转移。而线上交易的繁荣,则需要业务架构做相应的调整、演进才能支撑业务的快速发展。本文主要通过介绍闲鱼从0发展到千万级DAU应用的不同阶段的业务特点、核心问题以及针对性的架构演进,来阐述业务架构的演进思路与心得。 最强干货 阿里巴巴叶军:从0到1打造组织中台 近日,在乌镇召开的第六届世界互联网大会现场,浙江省政府与阿里巴巴集团合作开发的政务钉钉首次正式发布。 随着政务钉钉的正式亮相,政务钉钉事业部总经理叶军与他带领的团队也逐步走进大众视野。 政务钉钉如何帮助政府做数字化?阿里巴巴自身又是如何做企业管理数字化的?带着这些疑问,我们邀请到了叶军,从他与他的“组织中台”故事说起。 30万“被消失”的视障用户,如何在淘宝剁手盖楼? 虽然眼睛看不到天猫双11全民狂欢的场景,但双11却真实地从小沈的指尖传至心间。无障碍体验持续改善的背后,是阿里持续打造公平普惠营商环境的努力:公平良性的竞争让商家有更好的成长机会,获利发展的商家才能有力量给全社会提供更多元的服务;不断提升安全能力让红包补贴能够真正到达消费者手中而不是被羊毛党薅走。 阿里巴巴 Kubernetes 应用管理实践经验 云原生时代,Kubernetes 的重要性日益凸显。然而,大多数互联网公司在 Kubernetes 上的探索并非想象中顺利,Kubernetes 自带的复杂性足以让一批开发者望而却步。本文中,阿里巴巴技术专家孙健波在接受采访时基于阿里巴巴 Kubernetes 应用管理实践过程提供了一些经验与建议,以期对开发者有所帮助。 每天读本书 带你读《微服务架构设计模式》之二:服务的拆分策略 本书中,微服务架构的先驱、Java 开发者社区的意见领袖 Chris Richardson 收集、分类并解释了 44 个架构设计模式,这些模式用来解决诸如服务拆分、事务管理、查询和跨服务通信等难题。本书不仅仅是一个模式目录,还提供了经验驱动的建议,以帮助你设计、实现、测试和部署基于微服务的应用程序。 精品公开课 PHP 微服务之路 本次直播主要讲的Hyperf,Hyperf 是基于 Swoole 的企业级的 PHP 全栈框架,超高的性能与优雅的设计的结合品,内置了大量的协程组件,开箱即用,且含有完善的服务治理相关组件,特别适用于搭建微服务架构。 每日集成开发者社区精品内容,请持续关注开发者必读。
》》点击这里获取:学懂区块链的1000篇好文集锦,更有认证问答官资格等你领《《 10月24日下午,在北京召开的区块链技术发展现状和趋势集体学习会成为了近期的热点话题。 如果你还不了解什么是区块链,以及区块链有哪些应用场景,那你就得开始补课了!现在开发者社区为你整理了那些,你了解区块链必须的知识点与专业书籍,快来领取你的进阶包吧! 学习区块链必看书籍,趁热打铁! 《区块链真相》 12大主题、80多个重大议题,采集原材料50万字,凝结着近40人的智慧,他们是企业家、科学家、大学教授、经济学家、比特币研究者、风险投资专家、数字业务发展战略家、法律界人士和科技媒体大佬、视频创作者,为各界人士尤其企业决策者,提供应对区块链的决策内参。 精彩试读:第一章:吃透区块链六大要领第二章:区块链带来的八大变革第三章:区块链对金融行业和世界经济的影响 《区块链工程实践——行业解决方案与关键技术》 本书是一部能全方位指导区块链项目落地的实操性著作。作者是远光软件的区块链首席科学家,而本书是作者5年来在区块链领域的实践总结。通过5个经典的行业案例,从总体设计、业务设计、功能接口设计、架构设计这4个维度详细讲解了如何构建一个完整的区块链行业解决方案,同时讲解了实现每个解决方案需要的关键技术和方法。 精彩试读:第一章:基于区块链的可信电子证照第二章:电力市场交易结算智能合约 《基于区块链的物联网项目开发》 本书首先概述当前业务场景中的物联网概念,帮助读者在IBM Watson物联网平台上开发自己的设备,并使用Watson和Intel Edison创建物联网解决方案。之后介绍如何利用Hyperledger框架开发区块链网络,以及如何创建自己的集成区块链和物联网解决方案。接下来的章节讲述了如何在IBM Cloud平台利用物联网来实现端到端的区块链解决方案。最后,你将掌握如何将物联网和区块链技术融合,利用实践和驱动程序来开发实用集成解决方案。 精彩试读:第一章:了解物联网并在IBM Watson物联网平台上开发第二章:创建物联网解决方案 《区块链开发实战: 基于JavaScript的公链与DApp开发》 本书用三个部分讲解了区块链技术以及Asch的相关实践,第一部分讲解了区块链技术的基本概念,并用300行代码实现了一个最小的、可运行的区块链;第二部分分析Asch的源码,讲解Asch的实现原理;第三部分介绍了基于Asch的侧链技术的DApp开发实战。 精彩试读:第一章:自己动手实现一个区块链系统第二章:DApp开发简介第三章:Asch——区块链应用开发平台
》》点击这里获取:你不可错过的4本区块链必读进阶书籍《《10月24日下午,在北京召开的区块链技术发展现状和趋势集体学习会成为了近期的热点话题。 如果你还不了解什么是区块链,以及区块链有哪些应用场景,那你就得开始补课了!现在开发者社区为你整理了那些,你了解区块链必须的知识点与专业书籍,快来领取你的进阶包吧! 1000篇好文帮你破解区块链密码! 随着区块链应用的不断深化以及强劲技术的不断深耕,区块链已经成为备受关注的热点。 从区块链1.0时代落地数字货币比特币、莱特币等,打开了区块链通向新弯道的高速路口,到区块链2.0时代开始通过智能合约来解决货币支付难题,再到3.0时代区块链尝试向各传统行业发力,标志着区块链逐渐由萌芽状态走向实际满足人们渴求状态。 正值区块链技术发展势头之际,开发者社区特整理出1000篇关于区块链的文章 分享给大家,从技术原理到应用实践,应有尽有! 比如小白最关心的“什么是区块链”,这里一个简单趣味的“去中心化借贷模型”带你快速入门! 还不知道 比特币和区块链的那些渊源?这篇文章给你细说这些行业现状与矛盾! 一看就会,一做就废?那你需要这篇 5分钟创建并玩转属于自己的区块链,合辑中还有百篇区块链应用等你收藏! 更多精彩等你发现!现在就收藏起来吧! 干货!区块链入门、进阶、行业专家观点!1000篇好文帮你破解区块链密码!(上篇) 干货!区块链入门、进阶、行业专家观点!1000篇好文帮你破解区块链密码!(中篇) 干货!区块链入门、进阶、行业专家观点!1000篇好文帮你破解区块链密码!(下篇) 26问搞懂区块链,互动赢取问答官认证资格! 如果你是 区块链小白,对区块链的概念仍然很模糊,听过许多种解释,却还是没有一个总结性的描述。那么在“区块链26问”中你将获得最全面的解答!包括区块链的概念、区块链的场景应用、区块链技术原理以及区块链的发展前景等等! 如果你已经是 专业人士,觉得自己有更加通俗易懂的分享,那么我们热烈欢迎你在这些问答中写出属于你自己的 “独家百科词条” ,我们会为优质回答提供独家社区问答官认证资源和限量奖品! 》》什么是区域链?区域链技术的原理又是怎样的? 》》区块链技术要用到什么开发语言?》》怎么利用区块链创造营收?》》区块链+电商如何实现从0到1?》》区块链会改变哪些行业?会给我们生活带来哪些变化? 更多问题 点击这里 !区块链问与答礼包拿走不谢!
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 Go语言出现后,Java还是最佳选择吗? 随着大量新生的异步框架和支持协程的语言(如Go)的出现,在很多场景下操作系统的线程调度成为了性能的瓶颈,Java也因此被质疑是否不再适应最新的云场景了。 4年前,阿里JVM团队开始自研Wisp2,将Go语言的协程能力带入到Java世界。既享受Java的丰富生态,又获得异步程序的性能,Wisp2让Java平台历久弥新。 最强干货 下载达 10 万次的 IDEA 插件,K8s 一键部署了解一下? 涉及开发的技术人员,永远绕不开的就是将应用部署到相应服务器上,本文将给大家讲解:对于容器服务 ACK,怎么实现真正“一键部署”,提高开发部署效率,在 K8s 的运用上做到快人一步。 云栖全程回顾|搜索推荐工程技术专场(附视频与文档) 2019年9月26日在云栖大会《搜索推荐工程技术专场》上,介绍了阿里巴巴搜索推荐与广告,淘系推荐算法云上赋能的分享。基于阿里巴巴十几年搜索与推荐引擎的技术沉淀,承载了包括淘宝、天猫、菜鸟、盒马、钉钉、优酷乃至海外电商在内的整个阿里集团业务,同时由搜索推荐体系支撑起的云产品矩阵已服务于全球的开发者。本次分享邀请到了阿里巴巴搜索和推荐最核心的资深技术专家,为大家带来搜索和推荐领域最前沿、专业、深度的技术内容盛宴。 闲鱼前端基于serverless的一种多端开发解决方案 前端的发展太快了,前端框架和技术的发展也层出不穷,还包括不同智能设备的出现,对前端开发同学来说是个很大的跳转。 这样就滋生了一些问题,比如我要开发一个通用的页面,兼容不同的端测和小程序,显然目前是做不到的,我们只能开发多套页面去适配不同的场景,这样的话成本就太高了。 这篇文章我们要探讨的就是,看能不能换个角度去解决这个问题,提升开发效率。 每天读本书 带你读《Redis 5设计与源码分析》之二:简单动态字符串 简单动态字符串(Simple Dynamic Strings,SDS)是Redis的基本数据结构之一,用于存储字符串和整型数据。SDS兼容C语言标准字符串处理函数,且在此基础上保证了二进制安全。本章将详细讲解SDS的实现,为读者理解Redis的原理和各种命令的实现打下基础。 精品公开课 如何基于Cassandra建模? 你将能在本科中学到:·介绍cassandra使用场景·如何基于cassandra建模·设计一个基于cassandra的前台系统10月31日下午16:30,开发者社区实战课堂邀请到阿里云数据库高级专家恬泰,为大家详解如何基于cassandra建模。 每日集成开发者社区精品内容,请持续关注开发者必读。
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 深度 | 打败围棋冠军后,机器智能下一步能战胜黑客吗? 从深蓝战胜象棋冠军到AlphaGo战胜围棋冠军,每一次机器智能在特定领域战胜人类,都会引发整个社会的广泛关注。洞察了棋类博弈真相的机器智能,接下来能洞察网络安全的真相并且在黑客博弈中战胜人类吗?在机器智能炙手可热的今天,或许我们该静下心来,去理解机器智能的本质、网络安全的困境以及未来二者结合的挑战。 最强干货 如何有效降低大数据平台安全风险 在2019杭州云栖大会大数据企业级服务专场,由阿里云智能计算平台事业部资深技术专家李雪峰带来以“如何有效降低大数据平台安全风险”为题的演讲。本文首先概括了企业在大数据上云过程中会产生的安全顾虑。接着,在大数据平台中要处理的安全风险中,对数据中心物理安全与网络安全、大数据平台系统安全以及数据应用安全三部分做了详细的介绍。最后,描述了阿里云飞天大数据平台的安全体系。 揭秘阿里云WAF背后神秘的AI智能防御体系 应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在,也正是这些针对Web应用的安全威胁促使了WAF这个产品的不断发展和进化。同时,各种机器学习算法和模型也被不断提出和应用在WAF等安全产品中,以期望解决这些风险。 一篇文章带你了解阿里云全域集成解决方案背后的黑科技 在云栖大会的全域集成发布会现场,一位工程师在100%真实的环境下,为所有来宾现场演示了“从零开始搭建一款集成应用”的过程。通过全域集成中台,仅仅用了5分钟时间就快速搭建好了一个企业中常见的“发票识别”集成应用,并且成功推送识别成功后的发票内容详情。 作为阿里云SaaS加速器的重要组成部分,全域集成解决方案为客户和伙伴提供“集成加速”能力,本文将聚焦现代企业数字化转型的中台策略,全方位探索全域集成的强大功能。 每天读本书 带你读《Redis 5设计与源码分析》之一:Redis简介 多名专家联袂推荐,资深专家联合撰写,深入理解Redis 5设计精髓。本书系统讲解Redis 5设计、数据结构、底层命令实现,以及持久化、主从复制、集群的实现,重点讲解了SDS、跳跃表、压缩列表、字典、整数集合、键、字符串、哈希表、列表、集合、有序集合、GEO、quicklist和Stream数据结构、HyperLog和Stream相关命令的实现以及Redis的生命周期、命令执行的过程。 精品公开课 以「澄清需求」为始,以「落地精益敏捷」为终 “输入垃圾,输出的还会是垃圾( Garbage in, Garbage out )”,这是 IT 行业的铁律。需求输入的质量,会影响、甚至决定过程和交付质量。在敏捷开发模式下,如何同时提高需求分析效率,又保障需求输入质量,是一个巨大的挑战,但并非无解。 本次课程,将介绍高效和高质量的需求澄清方法,帮助产品、开发和测试共同协作,分析需求,定义验收标准,形成对需求的一致理解,做到以终为始,奠定精益敏捷落地成功的关键实践基础。 每日集成开发者社区精品内容,请持续关注开发者必读。
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 深度 | 带领国产数据库走向世界,POLARDB底层逻辑是什么? 在刚刚结束的乌镇世界互联网大会上,阿里云自主研发的POLARDB云原生数据库当选世界互联网领先科技成果,凭实力站上C位。这个”包管“了北京市每天800万人次的公交出行的下一代分布式数据库到底有多强大?我们请阿里云智能数据库事业部总经理鸣嵩跟大家一起聊聊。 最强干货 关于前端与机器学习的疑惑,听 TensorFlow.js 负责人一一解答 本届 D2 前端技术论坛,我们十分荣幸地邀请到了 Google TensorFlow.js 团队的负责人 Ping Yu 作为「智能化」专场的嘉宾,为我们讲解 TensorFlow.js 生态系统,以及如何将现有的机器学习模型植入到前端。为了让大家对演讲主题更好的理解, 我们特地安排了此次专访,一起来听听他对前端与机器学习的见解。 备战双 11!蚂蚁金服万级规模 K8s 集群管理系统如何设计? Kubernetes 以其超前的设计理念和优秀的技术架构,在容器编排领域拔得头筹。 Kubernetes 的出现使得广大开发同学也能运维复杂的分布式系统,它大幅降低了容器化应用部署的门槛,但运维和管理一个生产级的高可用 Kubernetes 集群仍十分困难。本文将分享蚂蚁金服是如何有效可靠地管理大规模 Kubernetes 集群的,并会详细介绍集群管理系统核心组件的设计。 阿里云ECS跨地域整站容灾操作指南 混合云容灾服务(HDR)是阿里云提供的低成本高性能业务连续性保障的服务,可以为企业内部关键应用,互联网应用,乃至Hadoop大数据集群提供容灾服务。 其中的连续复制型(CDR)基于磁盘数据连续复制技术,可以为企业关键业务提供低至秒级RPO,分钟级RTO的容灾服务,极大缩短业务宕机时间,减少数据丢失损失。 CDR近期推出了针对阿里云上环境的跨地域和跨可用区容灾方案,可以为云上应用的业务连续性,等保合规要求等提供保障。本操作指南介绍的是一个典型的阿里云上应用跨地域整站异地容灾场景的操作方法。 每天读本书 带你读《企业数据湖》之三:Lambda架构:一种数据湖实现模式 在本章中,我们将介绍Lambda架构的一些细节,并解释该架构模式在本书的数据湖实现方案中的重要意义。 精品公开课 以「澄清需求」为始,以「落地精益敏捷」为终 “输入垃圾,输出的还会是垃圾( Garbage in, Garbage out )”,这是 IT 行业的铁律。需求输入的质量,会影响、甚至决定过程和交付质量。在敏捷开发模式下,如何同时提高需求分析效率,又保障需求输入质量,是一个巨大的挑战,但并非无解。 本次课程,将介绍高效和高质量的需求澄清方法,帮助产品、开发和测试共同协作,分析需求,定义验收标准,形成对需求的一致理解,做到以终为始,奠定精益敏捷落地成功的关键实践基础。 每日集成开发者社区精品内容,请持续关注开发者必读。
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 这件事,阿里爱了10年 阿里开源十年激荡史,这幅漫画为你讲全了!致敬那些义无反顾要做开源的“赶集”人! 最强干货 十年磨一剑:从2009年启动“去IOE”工程到2019年OceanBase拿下TPC-C世界第一 十年前(2009年)的9月,备受争议的“去IOE”工程启动。2010年5月,OceanBase的研发之路也相继拉开。历尽磨难,各种反对、讽刺挖苦,2019年10月,OceanBase TPC-C 名列世界第一!今天我们可以自豪地说,阿里巴巴数字经济体的小二们,十年磨一剑,终于解决了困扰国家已久的信息技术三大软肋(“CPU芯片、操作系统、数据库”)之一的数据库难题。 Dubbo 在 K8s 下的思考 Dubbo在2011开源之后,一直是国内最受欢迎的RPC框架,之后spring boot和Spring Cloud的面世,助推了微服务的火热程度。计算机的世界变化很快,自从容器和K8s登上舞台之后,给原有的RPC领域带来了很大的挑战。这个文章主要讲述RPC领域遇到的问题,以及RPC怎么去拥抱K8s怀抱的一些思考。 2019杭州云栖大会SaaS加速器专场回顾合集 SaaS加速器是为合作伙伴提供应用开发加速、集成加速、上云加速和售卖加速的技术和商业平台。本文收录了2019杭州云栖大会SaaS加速器专场系列报道,包括现场嘉宾分享、产品技术解读、重磅发布资讯等干货内容,持续更新中,敬请关注! 每天读本书 带你读《企业数据湖》之二:数据湖概念概览 数据湖概念的诞生,源自企业面临的一些挑战,如数据应该以何种方式处理和存储。企业有很强烈的诉求搭建自己的数据湖,数据湖不但能存储传统类型数据,也能存储任意其他类型数据,并且能在它们之上做进一步的处理与分析,产生最终输出供各类程序消费。在本章中,将介绍数据湖的一些主要方面,帮助读者理解为什么它对企业非常重要。 精品公开课 2019项目管理大会 | 主论坛 2019项目管理大会隆重召开。亚太项目管理领域的重量级年度盛会:多位极具影响力的世界组织高管和领袖发表演讲;业界权威PMI(中国)项目管理大奖现场揭晓及大奖得主分享;阿里专场邀请主要业务域专家分享阿里作为“科技赋能者”对产业发展的巨大推动和宝贵经验。 每日集成开发者社区精品内容,请持续关注开发者必读。
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 贾扬清:把生命浪费在有意思的事情上 今天,是1024程序员节。在这个“攻城狮”自带光芒的日子里,身为阿里巴巴集团副总裁AI大神贾扬清,聊一聊作为开发者,他自己的开发经历,希望对你有所启发。 最强干货 数据上云,应该选择全量抽取还是增量抽取? 数据抽取是指从源数据抽取所需要的数据, 是构建数据中台的第一步。 数据源一般是关系型数据库,随着移动互联网的蓬勃发展,出现了其他类型的数据源,从技术实现方式来讲,从关系型数据库获取数据,可以细分为全量抽取、增量抽取2种方式,两种方法分别适用于不用的业务场景。 高德在提升定位精度方面的探索和实践 2019杭州云栖大会上,高德地图技术团队向与会者分享了包括视觉与机器智能、路线规划、场景化/精细化定位时空数据应用、亿级流量架构演进等多个出行技术领域的热门话题。现场火爆,听众反响强烈。 收益 or 挑战?Serverless 究竟给前端带来了什么 前端开发者是最早享受到 “Serverless” 好处的群体,因为浏览器就是一个开箱即用、甚至无需为计算付费的环境!Serverless 把前端开发体验带入了后端,利用 FaaS 与 BaaS 打造一套开箱即用的后端开发环境。本文作者将从前端角度出发,为你讲述 Serverless 带来的收益及挑战。 每天读本书 带你读《企业数据湖》之一: 数据导论 以通用的方式向读者介绍什么是数据,以及数据与企业的相关性。该章解释了在当前社会数据为什么重要,以及应该如何使用它们。现实生活中的各种用例已经展示了数据的重要性以及数据是如何改变企业的。这些真实的案例将启发读者的创造性思维。 精品公开课 《客户关系管理CRM》应用搭建 10月25日晚19时,你将在这里学到如何用宜搭实现0代码搭建CRM常见流程设计,流程中角色,变量,接口人的设置;审批页面的编辑权限设置,审批方式和审批机制的区别;CRM的报表展示,多表关联显示明细组件,以及明细的条件过滤和报表跳转详情页面。 每日集成开发者社区精品内容,请持续关注开发者必读。
多少程序员们因为各种原因错过了那些轰动科技界的盛会,但是既然这是程序员的节日,开发者社区就绝对不能让大家空着手回去(加班)! 更多礼包点这里——1500+面试题+17组成长笔记 | 1024程序员节技术礼包之一 程序员必下20本电子书:Java手册、Flutter最佳实践、AIoT开发手册... | 1024程序员节技术礼包之二 正文开始! -2019上半年值得关注的大会精选合辑- 2019年9月25日-27日,杭州云栖大会圆满举办。大会包含130+场峰会和专场、上千位重量级分享嘉宾以及硬核科技大型展区。 有来自《Git权威指南》作者蒋鑫带来的 “Go Git:面向未来的代码平台” ,还有多位阿里云分布式数据库领域核心专家以及业界专家为你带来 “顶级玩家集结分布式数据库专场” ,更有开源界大咖集体现身开源数据库专场,三位阿里云技术专家为大家介绍 最新阿里云开源数据库项目 ...... 这里还有超70份的 2019云栖大会精品PDF资料 ,点击下载:——超全2019云栖演讲稿实录资料,错过再等一年! 2019年7月24日,阿里云峰会(上海)开发者大会在上海世博中心盛大启程。 五大分场,大咖云集。精彩演讲PDF点击即看!阿里巴巴集团副总裁李飞飞 —— 下一代云原生数据库技术趋势 ;阿里巴巴集团副总裁贾扬清 —— 开源大数据与人工智能生态前瞻 ;以及阿里云智能技术战略总监陈绪 —— 剖析公共云降低IT成本的奥秘,解读云计算面向5G/ IoT的趋势...... 更有超过40篇的 峰会全场PDF合辑 一键下载! 更多精彩细节点击这里!2019阿里云峰会(上海)开发者大会五大分场演讲资料大全 KubeCon汇聚来自多个开源云原生社区的技术领军者,是云原生计算领域的顶级技术会议。这个火遍全球的云原生盛会就连 Linux及Git创始人 Linus 本尊也来了! 在这个特别的日子里,开发者社区双手呈上 KubeCon 6月25日议程亮点解读 及 6月26日议程亮点解读 (含 PPT下载); 如果还不够,这里还有 195个大会PPT合辑 钉盘一键下载,别忘了密码:EbSz 哦! 精彩议程解读点击这里——195个 KubeCon 2019精彩PPT & 议程全解析 3月21日举办的2019阿里云峰会·北京,将首次公开解读阿里云智能新的战略思考和发展方向。 观看大会回顾视频请点击这里! 12个专场,超过70篇大会PPT资料,点击下方链接立刻获取——2019阿里云峰会•北京回顾合集:PDF下载 2019年,国际语音交流协会INTERSPEECH第20届年会将于9月15日至19日在奥地利格拉茨举行。 阿里论文8篇入选,现在已全部开放下载,点击下面的链接,一次到位!8篇入选顶级语音领域会议的阿里论文全收录 -大咖演讲稿精选- 我们为大家整理了40余篇大咖演讲的整理稿件,从阿里巴巴副总裁贾扬清对于开源大数据生态的前瞻,到驻云首席架构师苏炎的阿里云迁云实战解析。覆盖行业的前沿视野和技术应用的最佳实践。大咖云集,全是干货,快来速取!! “飞天”如何有效支撑中国最大公共云:详情架构与演进Go Git:面向未来的代码平台图像搜索与识别背后的故事计算机视觉在智联网汽车领域的应用开放平台能为开发者带来什么价值?路径规划技术演进之路云上视觉智能的挑战与实践金融数据智能在蚂蚁金服的现状与发展阿里巴巴的云原生与开发者云原生数据库POLARDB专场“硬核”解析打造“云边一体化”,时序时空数据库TSDB技术原理深度解密“顶级玩家”集结!分布式数据库专场精华解读规模、性能、弹性全面升级,让天下没有难用的 K8s安全容器的发展与思考关于容器迁移、运维、查错与监控,你想知道的都在这里了应用上云新模式,Aliware 全家桶亮相杭州云栖大会Alibaba Cloud Linux 2-阿里云Linux操作系统全面解析企业音视频会议的挑战和机遇淘宝端智能演进和思考Flutter 原理与闲鱼深度实践企查查搜索引擎演进之路对象存储海量数据管理和应用最佳实践视觉智能在高德地图的应用开源界大咖集体现身,开源数据库专场重点再回眸!行业顶级NoSQL成员坐阵,NoSQL数据库专场重点解析!阿里云郑刚:SaaS上云工具包为企业应用构筑上云之梯阿里云高磊:API网关加速能力聚合与生态集成阿里云资深技术专家黄省江:让天下没有难做的SaaS宜搭PLUS发布:SaaS加速器面向ISV的技术红利破解企业数据库“疑难杂症”,最佳实践专场划重点了!阿里巴巴集团副总裁贾扬清:开源大数据生态前瞻阿里云高级产品专家彭亚雄:企业级存储如何助力核心业务系统上云?阿里云高级技术专家张鹏程:破解云上管理六大痛点,从安全感走向幸福感阿里云资深技术专家周琦:让IT基础设施实现“自动驾驶”两位阿里云技术专家为你详解为什么容器和K8s成为混合云多云标准化的基石?阿里云高级技术专家胥希贇:5G时代的IoT畅想阿里云资深技术专家何万青:拆解超算上云的障碍,阿里云用了这三招阿里云技术战略总监陈绪:5G时代哪些核心技术值得关注?对话驻云创始人:七问技术创业者对话驻云首席架构师苏炎:阿里云迁云实战解析阿里云MVP缪鹏:中小型企业运维之路阿里云智能总裁张建锋:解密中台战略——双中台+会员营销=?阿里云安全肖力:云上数据安全体系建设的六要素 点击这里 加入技术钉钉群,群内每周进行技术直播与问答
1024程序员节,开发者社区决定动用洪荒之力为你集齐整整 20本技术电子书 !!一次性打包送给你! 更多礼包点这里——1500+面试题+17组成长笔记 | 1024程序员节技术礼包之一 400+盛会PPT & 40+业内大咖精彩演讲解读 | 1024程序员节技术礼包之三 正文开始! 3年大合辑——12本阿里技术电子书全收录 一文带你看遍12本阿里技术精选电子书,从职业指导到技能指南,从演讲资料到学术论文,专属开发者的免费资料,大幅提升你的竞争力,快动动手指来下载吧! 《Java开发手册》——修炼一年终出关 《Java开发手册》始于阿里内部规约,在全球Java开发者共同努力下,已成为业界普遍遵循的开发规范。修炼一年终出关,此次新版将会给开发者带来更多惊喜。 《阿里巴巴云原生实践15讲》——阿里巴巴云原生规模化落地之路全景揭秘 阿里巴巴的技术团队完整的经历了云原生技术浪潮里的所有关键节点,作为这场技术革命的见证者和实践者,阿里在本书中聚集一线技术专家全面揭秘阿里巴巴云原生之路上的探索与实践。 《中国企业2020》——阿里云发布人工智能应用实践与趋势白皮书 阿里云研究中心结合大量的产业实践,在白皮书里提出了中国企业应用人工智能技术的成熟度分析和阶段性演进路径,总结出人工智能为企业创造价值的7大模式,为企业应用人工智能提供指导。 《长安十二时辰》——爆款背后的优酷技术秘籍首次公开 《长安十二时辰》一经播出便红遍全网,从智能算法到音视频创新技术,从智能档的技术挑战到高可用的媒资平台,成就这华丽视效的爆款背后,优酷技术都用到了哪些“武林秘籍”?话不多说,赶快点击下方链接下载阅读吧! 《0代码,搭应用》——宜搭开发手册,应用搭建从未如此简单 任何一个没有编码能力的人,通过宜搭可视化拖拽的方式,都能轻松搭建出自己想要的应用。传统模式下需要13天完成的应用,用宜搭2小时便可完成。 《阿里工程师的自我修养》——10位阿里大牛解决问题的思维方式 从入门到进阶,从普通员工到主管,从知识到落地,从量的积累到质的飞跃,在不确定性的世界中,你遇到的种种难题,阿里工程师正在探索着最优解。 《Flutter in action》——闲鱼Flutter企业级实践精选 《Flutter in action》电子书重磅发布,Google Flutter 团队强烈推荐,闲鱼多年最佳实践经验整理成册,揭秘亿级流量背后的技术秘籍,为你精解Flutter企业级实践。 《阿里云AIoT开发手册》——全栈物联网开发鸟瞰 物联网开发全路径:从设备端到云服务到应用端。适合嵌入式、服务开发、应用开发等各种背景的开发者学习,助你迅速了解物联网解决方案的架构和实现。 点击这里 加入技术钉钉群,群内每周进行技术直播与问答
作为一名开发者,1024 程序员日 你都干些什么? 敲代码?处理各方需求?还是已经进入了“双十一”备战? 虽然在这个专属程序员的日子里,你并不会放假,但是你现在却有机会获得 程序员节豪华技术大礼包 了!秘密就在下面的内容里! 开门见山的我必须先送你 程序员成长必读17篇 以表达我们的诚意! 更多礼包点这里——程序员必下20本电子书:Java手册、Flutter最佳实践、AIoT开发手册... | 1024程序员节技术礼包之二 400+盛会PPT & 40+业内大咖精彩演讲解读 | 1024程序员节技术礼包之三 正文开始! -7篇技术人个人成长精选 - 程序员,除了编码之外的软技能有哪些呢?不论是职业生涯、求职面试、就业创业、自我提升,甚至还包括:理财、健身、精神等。想要获得个人成长,首先就不能忘了这些“软技能”! 软技能,程序员编程之外的升值之道! 做业务就好比打仗,团队是我们的归属。想要有更好的发展,业务理解力同样关键!阿里巴巴前端技术专家悟寻将他在阿里的成长思考总结成: 技术人万能成长模式 送给在业务中深耕细作的你! 话说回来,在1024程序员节这天,你除了敲代码和吐槽以外,是不是啥也没做了呢?看看下面这些 程序员需要阅读的技术经典 你也应当给自己一个技术跃进的阶梯。上面这些书,会加深你对AI技术的理解,也能让你逐渐体会到这份事业的乐趣与价值所在。 其实编程是人类的基本技能,就像阅读、写作和算术一样。任何人都可以通过时间和努力学习编程。 作为程序员你不能成功的 10 个迹象 这份清单将帮助你了解你是否会在编程方面受挫,以及如果你想改变它,你可以做些什么。 但编程一定不是程序员的唯一技能。就像上面说的“软技能”一样,文档写作能力同样也是一个重要的效能提升技能。 听说要写文档,程序员的第一反应是:程序员为什么要写文档?不写!但其实沟通纪要、会议纪要、周报、工作总结、需求文档等等,这些都是文档,文档是研发的根据,关乎项目的成败,这篇文章就教你怎么写好一篇文档。 程序员要不要写文档?如何写好文档 会“砍”需求,并不是件容易的事情,这涉及到工程师的商业头脑,要会判断技术和业务的关系。技术与业务好比“两条腿”,相互配合才能走得更远,这就是我们下面的课题。 会“砍需求”的技术同学,该具备哪6个能力? 最后送给大家三个故事: Discover Ant 实习生夏令营的开营仪式上,支付宝首席架构师王维来到现场,讲述这十年里陪伴他不断成长的三种精神,三个故事。这些故事一样送给正在看的你。 懵懂到成熟,支付宝首席架构师做了这三件事 -5则技术进阶精选 - Don Roberts 提出的一条重构准则:第一次做某件事时只管去做;第二次做类似的事时会产生反感,但无论如何还是可以去做;第三次再做类似的事时,你就应该重构。 编码也是如此,当多次编写类似的代码时,我们需要考虑是否有一种方法能够提高编码速度,让编码速度“起飞”?高德地图技术专家陈昌毅(常意)多年来致力于敏捷开发,总结了一套编码的方法论: 这6种编码方法,你掌握了几个? 这些方法有助于程序员"快速、优质、高效"地进行编码。 而衡量代码质量的标准,有一句幽默却精髓的总结:WTF/min —— by Robert C. Martin。 当被问道什么是好的代码时,很多人可能会先愣一下,显然,这个问题并没有唯一的标准答案,谁都可以谈论自己的理解,下面就谈谈对于好代码的理解。 阿里工程师谈,什么是好的代码? 希望这对你写代码的习惯有帮助!但有时我们不只是了写代码。 废话不多说,作为程序员,秀技能也是生活乐趣之一,但请先看看这26个Python实用技巧你了解多少,这是你能拿出去”秀“的前提条件。 想秀技能?先get这份Python技术列表! “小白如何成为挖洞大神?”很多刚开始接触网络安全的同学都可能会遇到这个问题。但不论学习什么,过程很重要,下面篇文章将会从知识和工具的角度为你讲解。 网络安全入门——小白如何成为“挖洞大神”? 如果你初来乍到,大数据会看起来很吓人!根据你掌握的基本理论,让我们专注于一些关键术语以此给你的约会对象、老板、家人或者任何一个人带来深刻的印象。 每个人都应该知道的25个大数据术语 -5则业务晋升精选 - 张建飞是阿里巴巴高级技术专家,一直在致力于应用架构和代码复杂度的治理。面对零售通如此复杂的业务场景,如何在架构和代码层面进行应对,Frank 沉淀了一套“如何写复杂业务代码”的方法论,在此分享给大家。 阿里高级技术专家方法论:如何写复杂业务代码? 团队同学在最初的一段时间都提出这样的疑惑,堪称技术人灵魂3问:如何在业务中发现有技术价值的问题?发现问题后如何思考和发起再到解决?最后的技术结果跟业务结果如何衔接? 技术人的灵魂3问,阿里工程师如何解答? 干系人管理是一门较为复杂的艺术,既会涉及沟通,又将涉及管理学,可见其难度之大;那么我们在基于不确定性极大、变化极快的创新型业务时,作为 PM 应如何做好干系人管理呢? 知己知彼,百战百胜!如何做好干系人管理 现代企业的各位管理者,遇到最大的两类问题就是战略和组织,能够看到、想到、做到“重视人才”的企业,成功的概率总是会大那么一点点的。你的公司呢? 领导者必备:三元简化模型,助你加速团队成长 作为软件开发工程师,职业生涯中的我们往往都是在为别人“打工”,从项目规划到开发,再到项目发布。我们不止经历了多少个这种循环。你,考虑过自己做一款产品吗? 还在“替人打工”?来试试做自己的产品吧! 同样,在这个程序员普(qiáng)天(xíng)同庆的日子里,我们也绝不会忘掉准备在明年“金三银四” 疯狂投递简历 的你! 那么下面这个 程序员面试必看 系列一定很适合你! -面试宝典系列- 涵盖了 35 道经典面试题和解析,170 道挑战题,1460 个Java热门问答的 Java工程师面试宝典,还附带华山版阿里巴巴《Java开发者手册》等你下载!还不来看看先? 这里还有 Python工程师面试宝典 ,内含 12 个Python知识点,20 个经典场景分析和干货内容,110 道面试题,最全Python面试宝典助你get your offer!! 这里为你量身定制了一份 运维工程师的专属面试宝典,7大知识板块,200+面试详解,助你过关斩将,快来把你心仪的offer纳入囊中吧! 最后向你介绍一个曾荣登国内 “最受欢迎IT行业职位排行榜” 首位的职业!他们通过算法挖掘隐藏数据,使企业决策智能化和自动化,让企业在激烈竞争中立于不败之地。面试宝典双手呈上 数据挖掘工程师面试宝典 ,快来收藏吧! -阿里面试经验系列- 这里汇聚了 12则阿里巴巴面试经验分享,不打不准备之仗,快来了解一下顶尖的IT公司各岗位面试都要准备些什么吧! 阿里巴巴Java开发工程师面试总结 蚂蚁金服Java开发工程师面试总结 阿里巴巴C++研发实习生面试经验总结 蚂蚁金服机器学习实习生内推面试总结 阿里巴巴信息平台事业部Java研发社招面试总结 蚂蚁金服Java研发实习生5轮面试问题总结 支付宝IoT部门Java研发工程师面试经验 菜鸟网络Java研发工程师面试经验(社招) 阿里巴巴测试开发工程师面试经验 阿里巴巴Android客户端开发实习生面试经验 阿里巴巴Java研发工程师5面经验 阿里巴巴Java方向面试题汇总(含答案) 这些如果还不够,那...... 我就只能送你 面试一点通 技术圈的链接了! 最后祝广大程序员们,节(jiā)日(bān)快乐! 点击这里 加入技术钉钉群,群内每周进行技术直播与问答
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 6万人同时离场,竟然一点都不挤?原来用了这个神器 阿里20周年年会上,全球6万阿里人 "回家",用一种特别的方式为阿里庆生。年会现场,每位阿里员工人手一只白色IoT手环,这个由102颗LED小灯组成的手环,随着现场音乐、节目节奏变幻不同色彩。别小看这只手环,它会找到你的专属座位,为马老师送礼物(组成生日快乐字样),会告诉你绿色请等待,红色请离场。总之,这项阿里巴巴黑科技今天被阿里妹首次揭秘了,这个“小玩意”有大作用哦~ 最强干货 阿里云张建锋:工业互联网要解决三个问题 10月21日,在第六届世界互联网大会“工业互联网的创新与突破”论坛上,阿里云智能总裁张建锋表示,工业互联网要解决三个问题: 一、从原来单点的工厂变成全产业链、全价值链、全要素的一个融合。二利用新技术来提升效率,变成数字化智能化的工厂。三、工业产品怎么做到智能化。原来只做一个电视机,今天变成一个智能化的电视机。一条普通的高速公路变成智能的高速公路。 围绕这个目标,数字化技术是工业互联网最根本的一个推动力。 开放计算架构:蚂蚁金服是如何用一套架构容纳所有计算的? 十几年来,蚂蚁金服一直在解决用技术重塑金融服务的问题,在解决这个问题的过程中涉及到两个方向的技术领域,第一就是解决怎么把钱从一个帐户移到另一个帐户,这个过程中出现海量、安全、可用性问题怎么解决,我们的答案就是多地容灾、高可用的分布式架构;第二,新的数字金融时代到来,如何更多更好的利用数据驱动业务发展,也就是数据智能技术。 手绘稿如何1秒变身数据大屏?深度学习让人人成为可视化专家 想在1天内快速搞定实时业务数据大屏吗?想用最短路径逆袭成为数据可视化大神吗?想在除了PRD外什么都没有的情况下,体验职场真人版绝境求生吗? LADV是DataV内嵌的智能识别设计产品,能够迅速学习和识别手绘草图、信息图表、大屏截图等资料,并在DataV内自动生成可配置的可视化应用。 有了LADV今后人人都能做可视化专家了! 每天读本书 带你读《Java并发编程的艺术》之三:Java内存模型 Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,本章将揭开Java内存模型神秘的面纱。 精品公开课 以终为始,高效地分析和澄清需求 现实中,许多敏捷实施的失败,都根源于缺少有效的需求实践,特别是合理的需求拆分。本次课程将介绍,为什么在问题域拆分需求是敏捷开发的前提;以及如何基于业务场景拆分和组织需求、合理规划交付节奏,奠定持续交付和迭代反馈的基础。 每日集成开发者社区精品内容,请持续关注开发者必读。
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 如何像智能机一样管理云端应用?全球首个应用管理模型开源 全球首个云原生应用标准定义与架构模型 Open Application Model (OAM)开源项目,由阿里云与微软联合推出。今天,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在上海重磅宣布。OAM 的愿景是以标准化的方式沟通和连接应用开发者、运维人员、应用基础设施,让云原生应用管理与交付变得更加简洁,高效。 最强干货 阿里云肖力:云即信任 2005年,杭州文二路的一家不知名企业,迎来了公司成立后的第一名安全工程师,这在那个连“互联网业务”都还有些模糊不清的年代里,无疑是一次略显前卫的决定。 14年后的今天,当初这家不知名的企业早已实现了从0到99的突破,正在朝向100的终点迈进;而那个年轻的安全工程师,则呼啸着云计算的浪潮,带领着自己的团队,一次又一次将云安全的产品和服务输出到更多的用户身边。 这个人就是肖力,而那家不知名企业,便是阿里巴巴。 支付宝王益:40岁写30年代码是一种什么体验? 对于蚂蚁金服研究员王益而言,2019年是个颇有纪念意义的年份。今年他整40岁。从10岁开始,写代码整30年。这30年来,他当过“不务正业”的学生,创纪录地在大一就考下系统分析员,“单枪匹⻢”闯荡过从国内到硅谷的多家知名互联网科技公司,和AI领域许多传奇人物都有所交集。不惑之年对于许多工程师来说,或许已是需要焦虑的年龄,但40岁的王益在蚂蚁金服每天都过得很充实:起床,自由泳一千米,然后去做他最喜欢的事——写代码和组织大家一起写代码。 使用Spark Streaming SQL进行PV/UV统计 PV/UV统计是流式分析一个常见的场景。通过PV可以对访问的网站做流量或热点分析,例如广告主可以通过PV值预估投放广告网页所带来的流量以及广告收入。 使用Spark Streaming SQL,并结合Redis可以很方便进行PV/UV的统计。本文将介绍通过Streaming SQL消费Loghub中存储的用户访问信息,对过去1分钟内的数据进行PV/UV统计,将结果存入Redis中。 每天读本书 带你读《Java并发编程的艺术》之二:Java并发机制的底层实现原理 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。本章我们将深入底层一起探索下Java并发机制的底层实现原理。 精品公开课 主机层主要攻击 、口令破解和权限提升 如何成为网络安全工程师?不知道该如何入门?本课程通过四个模块的知识学习,让您能够对网络安全相关基础技术有一个全面的了解和掌握,主要内容包括:IT基础技术、网络安全基础概念、网络安全渗透技术基础及Web应用安全基础。主要的学习方式包括在线直播、图文和在线实验进行学习。如果您是一位对网络安全感兴趣的大学生,我们还会根据您学习过程的参与情况,与线下考试情况,给您推荐实习或就业机会,快快来参与吧。 每日集成开发者社区精品内容,请持续关注开发者必读。
点击这里查看第一章:并发编程的挑战点击这里查看第二章:Java并发机制的底层实现原理 第3章:Java内存模型 Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,本章将揭开Java内存模型神秘的面纱。本章大致分4部分:Java内存模型的基础,主要介绍内存模型相关的基本概念;Java内存模型中的顺序一致性,主要介绍重排序与顺序一致性内存模型;同步原语,主要介绍3个同步原语(synchronized、volatile和f?inal)的内存语义及重排序规则在处理器中的实现;Java内存模型的设计,主要介绍Java内存模型的设计原理,及其与处理器内存模型和顺序一致性内存模型的关系。 3.1 Java内存模型的基础 3.1.1 并发编程模型的两个关键问题在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。同步是指程序中用于控制不同线程间操作发生相对顺序的机制。在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。如果编写多线程程序的Java程序员不理解隐式进行的线程之间通信的工作机制,很可能会遇到各种奇怪的内存可见性问题。 3.1.2 Java内存模型的抽象结构在Java中,所有实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享(本章用“共享变量”这个术语代指实例域,静态域和数组元素)。局部变量(Local Variables),方法定义参数(Java语言规范称之为Formal Method Parameters)和异常处理器参数(Exception Handler Parameters)不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响。Java线程之间的通信由Java内存模型(本文简称为JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。Java内存模型的抽象示意如图3-1所示。 图3-1 Java内存模型的抽象结构示意图 从图3-1来看,如果线程A与线程B之间要通信的话,必须要经历下面2个步骤。1)线程A把本地内存A中更新过的共享变量刷新到主内存中去。2)线程B到主内存中去读取线程A之前已更新过的共享变量。下面通过示意图(见图3-2)来说明这两个步骤。 图3-2 线程之间的通信图 如图3-2所示,本地内存A和本地内存B由主内存中共享变量x的副本。假设初始时,这3个内存中的x值都为0。线程A在执行时,把更新后的x值(假设值为1)临时存放在自己的本地内存A中。当线程A和线程B需要通信时,线程A首先会把自己本地内存中修改后的x值刷新到主内存中,此时主内存中的x值变为了1。随后,线程B到主内存中去读取线程A更新后的x值,此时线程B的本地内存的x值也变为了1。从整体来看,这两个步骤实质上是线程A在向线程B发送消息,而且这个通信过程必须要经过主内存。JMM通过控制主内存与每个线程的本地内存之间的交互,来为Java程序员提供内存可见性保证。 3.1.3 从源代码到指令序列的重排序在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。重排序分3种类型。1)编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。2)指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-Level Parallelism,ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。3)内存系统的重排序。由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。从Java源代码到最终实际执行的指令序列,会分别经历下面3种重排序,如图3-3所示。 图3-3 从源码到最终执行的指令序列的示意图 上述的1属于编译器重排序,2和3属于处理器重排序。这些重排序可能会导致多线程程序出现内存可见性问题。对于编译器,JMM的编译器重排序规则会禁止特定类型的编译器重排序(不是所有的编译器重排序都要禁止)。对于处理器重排序,JMM的处理器重排序规则会要求Java编译器在生成指令序列时,插入特定类型的内存屏障(Memory Barriers,Intel称之为Memory Fence)指令,通过内存屏障指令来禁止特定类型的处理器重排序。JMM属于语言级的内存模型,它确保在不同的编译器和不同的处理器平台之上,通过禁止特定类型的编译器重排序和处理器重排序,为程序员提供一致的内存可见性保证。 3.1.4 并发编程模型的分类现代的处理器使用写缓冲区临时保存向内存写入的数据。写缓冲区可以保证指令流水线持续运行,它可以避免由于处理器停顿下来等待向内存写入数据而产生的延迟。同时,通过以批处理的方式刷新写缓冲区,以及合并写缓冲区中对同一内存地址的多次写,减少对内存总线的占用。虽然写缓冲区有这么多好处,但每个处理器上的写缓冲区,仅仅对它所在的处理器可见。这个特性会对内存操作的执行顺序产生重要的影响:处理器对内存的读/写操作的执行顺序,不一定与内存实际发生的读/写操作顺序一致!为了具体说明,请看下面的表3-1。 表3-1 处理器操作内存的执行结果 假设处理器A和处理器B按程序的顺序并行执行内存访问,最终可能得到x = y = 0的结果。具体的原因如图3-4所示。 图3-4 处理器和内存的交互 这里处理器A和处理器B可以同时把共享变量写入自己的写缓冲区(A1,B1),然后从内存中读取另一个共享变量(A2,B2),最后才把自己写缓存区中保存的脏数据刷新到内存中(A3,B3)。当以这种时序执行时,程序就可以得到x = y = 0的结果。从内存操作实际发生的顺序来看,直到处理器A执行A3来刷新自己的写缓存区,写操作A1才算真正执行了。虽然处理器A执行内存操作的顺序为:A1→A2,但内存操作实际发生的顺序却是A2→A1。此时,处理器A的内存操作顺序被重排序了(处理器B的情况和处理器A一样,这里就不赘述了)。这里的关键是,由于写缓冲区仅对自己的处理器可见,它会导致处理器执行内存操作的顺序可能会与内存实际的操作执行顺序不一致。由于现代的处理器都会使用写缓冲区,因此现代的处理器都会允许对写-读操作进行重排序。表3-2是常见处理器允许的重排序类型的列表。表3-2 处理器的重排序规则 注意,表3-2单元格中的“N”表示处理器不允许两个操作重排序,“Y”表示允许重排序。从表3-2我们可以看出:常见的处理器都允许Store-Load重排序;常见的处理器都不允许对存在数据依赖的操作做重排序。sparc-TSO和X86拥有相对较强的处理器内存模型,它们仅允许对写-读操作做重排序(因为它们都使用了写缓冲区)。sparc-TSO是指以TSO(Total Store Order)内存模型运行时sparc处理器的特性。表3-2中的X86包括X64及AMD64。由于ARM处理器的内存模型与PowerPC处理器的内存模型非常类似,本文将忽略它。数据依赖性后文会专门说明。为了保证内存可见性,Java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序。JMM把内存屏障指令分为4类,如表3-3所示。表3-3 内存屏障类型表 屏障类型 指令示例 说 明 LoadLoad Barriers Load1; LoadLoad; Load2 确保Load1数据的装载先于Load2及所有后续装载指令的装载 StoreStore Barriers Store1; StoreStore; Store2 确保Store1数据对其他处理器可见(刷新到内存)先于Store2及所有后续存储指令的存储 LoadStore Barriers Load1; LoadStore; Store2 确保Load1数据装载先于Store2及所有后续的存储指令刷新到内存 StoreLoad Barriers Store1; StoreLoad; Load2 确保Store1数据对其他处理器变得可见(指刷新到内存)先于Load2及所有后续装载指令的装载。StoreLoad Barriers会使该屏障之前的所有内存访问指令(存储和装载指令)完成之后,才执行该屏障之后的内存访问指令 StoreLoad Barriers是一个“全能型”的屏障,它同时具有其他3个屏障的效果。现代的多处理器大多支持该屏障(其他类型的屏障不一定被所有处理器支持)。执行该屏障开销会很昂贵,因为当前处理器通常要把写缓冲区中的数据全部刷新到内存中(Buffer Fully Flush)。 3.1.5 happens-before简介从JDK 5开始,Java使用新的JSR-133内存模型(除非特别说明,本文针对的都是JSR-133内存模型)。JSR-133使用happens- before的概念来阐述操作之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens- before关系。这里提到的两个操作既可以是在一个线程之内,也可以是在不同线程之间。与程序员密切相关的happens- before规则如下。程序顺序规则:一个线程中的每个操作,happens- before于该线程中的任意后续操作。监视器锁规则:对一个锁的解锁,happens- before于随后对这个锁的加锁。volatile变量规则:对一个volatile域的写,happens- before于任意后续对这个volatile域的读。传递性:如果A happens- before B,且B happens- before C,那么A happens- before C。两个操作之间具有happens-before关系,并不意味着前一个操作必须要在后一个操作之前执行!happens-before仅仅要求前一个操作(执行的结果)对后一个操作可见,且前一个操作按顺序排在第二个操作之前(the f?irst is visible to and ordered before the second)。happens- before的定义很微妙,后文会具体说明happens-before为什么要这么定义。happens-before与JMM的关系如图3-5所示。 图3-5 happens-before与JMM的关系 如图3-5所示,一个happens-before规则对应于一个或多个编译器和处理器重排序规则。对于Java程序员来说,happens-before规则简单易懂,它避免Java程序员为了理解JMM提供的内存可见性保证而去学习复杂的重排序规则以及这些规则的具体实现方法。 3.2 重排序重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。 3.2.1 数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分为下列3种类型,如表3-4所示。表3-4 数据依赖类型表 名 称 代码示例 说 明 写后读 a = 1;b = a; 写一个变量之后,再读这个位置 写后写 a = 1;a = 2; 写一个变量之后,再写这个变量 读后写 a = b;b = 1; 读一个变量之后,再写这个变量 上面3种情况,只要重排序两个操作的执行顺序,程序的执行结果就会被改变。前面提到过,编译器和处理器可能会对操作做重排序。编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。这里所说的数据依赖性仅针对单个处理器中执行的指令序列和单个线程中执行的操作,不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑。 3.2.2 as-if-serial语义as-if-serial语义的意思是:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器、runtime和处理器都必须遵守as-if-serial语义。为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。但是,如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序。为了具体说明,请看下面计算圆面积的代码示例。double pi = 3.14; // Adouble r = 1.0; // Bdouble area = pi r r; // C上面3个操作的数据依赖关系如图3-6所示。如图3-6所示,A和C之间存在数据依赖关系,同时B和C之间也存在数据依赖关系。因此在最终执行的指令序列中,C不能被重排序到A和B的前面(C排到A和B的前面,程序的结果将会被改变)。但A和B之间没有数据依赖关系,编译器和处理器可以重排序A和B之间的执行顺序。图3-7是该程序的两种执行顺序。 图3-7 程序的两种执行顺序as-if-serial语义把单线程程序保护了起来,遵守as-if-serial语义的编译器、runtime和处理器共同为编写单线程程序的程序员创建了一个幻觉:单线程程序是按程序的顺序来执行的。as-if-serial语义使单线程程序员无需担心重排序会干扰他们,也无需担心内存可见性问题。 3.2.3 程序顺序规则根据happens- before的程序顺序规则,上面计算圆的面积的示例代码存在3个happens- before关系。1)A happens- before B。2)B happens- before C。3)A happens- before C。这里的第3个happens- before关系,是根据happens- before的传递性推导出来的。这里A happens- before B,但实际执行时B却可以排在A之前执行(看上面的重排序后的执行顺序)。如果A happens- before B,JMM并不要求A一定要在B之前执行。JMM仅仅要求前一个操作(执行的结果)对后一个操作可见,且前一个操作按顺序排在第二个操作之前。这里操作A的执行结果不需要对操作B可见;而且重排序操作A和操作B后的执行结果,与操作A和操作B按happens- before顺序执行的结果一致。在这种情况下,JMM会认为这种重排序并不非法(not illegal),JMM允许这种重排序。在计算机中,软件技术和硬件技术有一个共同的目标:在不改变程序执行结果的前提下,尽可能提高并行度。编译器和处理器遵从这一目标,从happens- before的定义我们可以看出,JMM同样遵从这一目标。 3.2.4 重排序对多线程的影响现在让我们来看看,重排序是否会改变多线程程序的执行结果。请看下面的示例代码。 class ReorderExample { int a = 0; boolean f?lag = false; public void writer() { a = 1; // 1 f?lag = true; // 2 } Public void reader() { if (f?lag) { // 3 int i = a * a; // 4 …… } } } f?lag变量是个标记,用来标识变量a是否已被写入。这里假设有两个线程A和B,A首先执行writer()方法,随后B线程接着执行reader()方法。线程B在执行操作4时,能否看到线程A在操作1对共享变量a的写入呢?答案是:不一定能看到。由于操作1和操作2没有数据依赖关系,编译器和处理器可以对这两个操作重排序;同样,操作3和操作4没有数据依赖关系,编译器和处理器也可以对这两个操作重排序。让我们先来看看,当操作1和操作2重排序时,可能会产生什么效果?请看下面的程序执行时序图,如图3-8所示。 图3-8 程序执行时序图 如图3-8所示,操作1和操作2做了重排序。程序执行时,线程A首先写标记变量f?lag,随后线程B读这个变量。由于条件判断为真,线程B将读取变量a。此时,变量a还没有被线程A写入,在这里多线程程序的语义被重排序破坏了!本文统一用虚箭线标识错误的读操作,用实箭线标识正确的读操作。下面再让我们看看,当操作3和操作4重排序时会产生什么效果(借助这个重排序,可以顺便说明控制依赖性)。下面是操作3和操作4重排序后,程序执行的时序图,如图3-9所示。 图3-9 程序的执行时序图 在程序中,操作3和操作4存在控制依赖关系。当代码中存在控制依赖性时,会影响指令序列执行的并行度。为此,编译器和处理器会采用猜测(Speculation)执行来克服控制相关性对并行度的影响。以处理器的猜测执行为例,执行线程B的处理器可以提前读取并计算a*a,然后把计算结果临时保存到一个名为重排序缓冲(Reorder Buffer,ROB)的硬件缓存中。当操作3的条件判断为真时,就把该计算结果写入变量i中。从图3-9中我们可以看出,猜测执行实质上对操作3和4做了重排序。重排序在这里破坏了多线程程序的语义!在单线程程序中,对存在控制依赖的操作重排序,不会改变执行结果(这也是as-if-serial语义允许对存在控制依赖的操作做重排序的原因);但在多线程程序中,对存在控制依赖的操作重排序,可能会改变程序的执行结果。 3.3 顺序一致性顺序一致性内存模型是一个理论参考模型,在设计的时候,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参照。 3.3.1 数据竞争与顺序一致性当程序未正确同步时,就可能会存在数据竞争。Java内存模型规范对数据竞争的定义如下。在一个线程中写一个变量,在另一个线程读同一个变量,而且写和读没有通过同步来排序。当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此)。如果一个多线程程序能正确同步,这个程序将是一个没有数据竞争的程序。JMM对正确同步的多线程程序的内存一致性做了如下保证。如果程序是正确同步的,程序的执行将具有顺序一致性(Sequentially Consistent)——即程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同。马上我们就会看到,这对于程序员来说是一个极强的保证。这里的同步是指广义上的同步,包括对常用同步原语(synchronized、volatile和f?inal)的正确使用。 3.3.2 顺序一致性内存模型顺序一致性内存模型是一个被计算机科学家理想化了的理论参考模型,它为程序员提供了极强的内存可见性保证。顺序一致性内存模型有两大特性。1)一个线程中的所有操作必须按照程序的顺序来执行。2)(不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见。顺序一致性内存模型为程序员提供的视图如图3-10所示。 图3-10 顺序一致性内存模型的视图 在概念上,顺序一致性模型有一个单一的全局内存,这个内存通过一个左右摆动的开关可以连接到任意一个线程,同时每一个线程必须按照程序的顺序来执行内存读/写操作。从上面的示意图可以看出,在任意时间点最多只能有一个线程可以连接到内存。当多个线程并发执行时,图中的开关装置能把所有线程的所有内存读/写操作串行化(即在顺序一致性模型中,所有操作之间具有全序关系)。为了更好进行理解,下面通过两个示意图来对顺序一致性模型的特性做进一步的说明。假设有两个线程A和B并发执行。其中A线程有3个操作,它们在程序中的顺序是:A1→A2→A3。B线程也有3个操作,它们在程序中的顺序是:B1→B2→B3。假设这两个线程使用监视器锁来正确同步:A线程的3个操作执行后释放监视器锁,随后B线程获取同一个监视器锁。那么程序在顺序一致性模型中的执行效果将如图3-11所示。 图3-11 顺序一致性模型的一种执行效果 现在我们再假设这两个线程没有做同步,下面是这个未同步程序在顺序一致性模型中的执行示意图,如图3-12所示。 图3-12 顺序一致性模型中的另一种执行效果 未同步程序在顺序一致性模型中虽然整体执行顺序是无序的,但所有线程都只能看到一个一致的整体执行顺序。以上图为例,线程A和B看到的执行顺序都是:B1→A1→A2→B2→A3→B3。之所以能得到这个保证是因为顺序一致性内存模型中的每个操作必须立即对任意线程可见。但是,在JMM中就没有这个保证。未同步程序在JMM中不但整体的执行顺序是无序的,而且所有线程看到的操作执行顺序也可能不一致。比如,在当前线程把写过的数据缓存在本地内存中,在没有刷新到主内存之前,这个写操作仅对当前线程可见;从其他线程的角度来观察,会认为这个写操作根本没有被当前线程执行。只有当前线程把本地内存中写过的数据刷新到主内存之后,这个写操作才能对其他线程可见。在这种情况下,当前线程和其他线程看到的操作执行顺序将不一致。 3.3.3 同步程序的顺序一致性效果下面,对前面的示例程序ReorderExample用锁来同步,看看正确同步的程序如何具有顺序一致性。请看下面的示例代码。 class SynchronizedExample { int a = 0; boolean f?lag = false; public synchronized void writer() { // 获取锁 a = 1; f?lag = true; } // 释放锁 public synchronized void reader() { // 获取锁 if (f?lag) { int i = a; …… } // 释放锁 } } 在上面示例代码中,假设A线程执行writer()方法后,B线程执行reader()方法。这是一个正确同步的多线程程序。根据JMM规范,该程序的执行结果将与该程序在顺序一致性模型中的执行结果相同。下面是该程序在两个内存模型中的执行时序对比图,如图3-13所示。顺序一致性模型中,所有操作完全按程序的顺序串行执行。而在JMM中,临界区内的代码可以重排序(但JMM不允许临界区内的代码“逸出”到临界区之外,那样会破坏监视器的语义)。JMM会在退出临界区和进入临界区这两个关键时间点做一些特别处理,使得线程在这两个时间点具有与顺序一致性模型相同的内存视图(具体细节后文会说明)。虽然线程A在临界区内做了重排序,但由于监视器互斥执行的特性,这里的线程B根本无法“观察”到线程A在临界区内的重排序。这种重排序既提高了执行效率,又没有改变程序的执行结果。 图3-13 两个内存模型中的执行时序对比图 从这里我们可以看到,JMM在具体实现上的基本方针为:在不改变(正确同步的)程序执行结果的前提下,尽可能地为编译器和处理器的优化打开方便之门。 3.3.4 未同步程序的执行特性对于未同步或未正确同步的多线程程序,JMM只提供最小安全性:线程执行时读取到的值,要么是之前某个线程写入的值,要么是默认值(0,Null,False),JMM保证线程读操作读取到的值不会无中生有(Out Of Thin Air)的冒出来。为了实现最小安全性,JVM在堆上分配对象时,首先会对内存空间进行清零,然后才会在上面分配对象(JVM内部会同步这两个操作)。因此,在已清零的内存空间(Pre-zeroed Memory)分配对象时,域的默认初始化已经完成了。JMM不保证未同步程序的执行结果与该程序在顺序一致性模型中的执行结果一致。因为如果想要保证执行结果一致,JMM需要禁止大量的处理器和编译器的优化,这对程序的执行性能会产生很大的影响。而且未同步程序在顺序一致性模型中执行时,整体是无序的,其执行结果往往无法预知。而且,保证未同步程序在这两个模型中的执行结果一致没什么意义。未同步程序在JMM中的执行时,整体上是无序的,其执行结果无法预知。未同步程序在两个模型中的执行特性有如下几个差异。1)顺序一致性模型保证单线程内的操作会按程序的顺序执行,而JMM不保证单线程内的操作会按程序的顺序执行(比如上面正确同步的多线程程序在临界区内的重排序)。这一点前面已经讲过了,这里就不再赘述。2)顺序一致性模型保证所有线程只能看到一致的操作执行顺序,而JMM不保证所有线程能看到一致的操作执行顺序。这一点前面也已经讲过,这里就不再赘述。3)JMM不保证对64位的long型和double型变量的写操作具有原子性,而顺序一致性模型保证对所有的内存读/写操作都具有原子性。第3个差异与处理器总线的工作机制密切相关。在计算机中,数据通过总线在处理器和内存之间传递。每次处理器和内存之间的数据传递都是通过一系列步骤来完成的,这一系列步骤称之为总线事务(Bus Transaction)。总线事务包括读事务(Read Transaction)和写事务(Write Transaction)。读事务从内存传送数据到处理器,写事务从处理器传送数据到内存,每个事务会读/写内存中一个或多个物理上连续的字。这里的关键是,总线会同步试图并发使用总线的事务。在一个处理器执行总线事务期间,总线会禁止其他的处理器和I/O设备执行内存的读/写。下面,让我们通过一个示意图来说明总线的工作机制,如图3-14所示。 图3-14 总线的工作机制 由图可知,假设处理器A,B和C同时向总线发起总线事务,这时总线仲裁(Bus Arbitration)会对竞争做出裁决,这里假设总线在仲裁后判定处理器A在竞争中获胜(总线仲裁会确保所有处理器都能公平的访问内存)。此时处理器A继续它的总线事务,而其他两个处理器则要等待处理器A的总线事务完成后才能再次执行内存访问。假设在处理器A执行总线事务期间(不管这个总线事务是读事务还是写事务),处理器D向总线发起了总线事务,此时处理器D的请求会被总线禁止。总线的这些工作机制可以把所有处理器对内存的访问以串行化的方式来执行。在任意时间点,最多只能有一个处理器可以访问内存。这个特性确保了单个总线事务之中的内存读/写操作具有原子性。在一些32位的处理器上,如果要求对64位数据的写操作具有原子性,会有比较大的开销。为了照顾这种处理器,Java语言规范鼓励但不强求JVM对64位的long型变量和double型变量的写操作具有原子性。当JVM在这种处理器上运行时,可能会把一个64位long/double型变量的写操作拆分为两个32位的写操作来执行。这两个32位的写操作可能会被分配到不同的总线事务中执行,此时对这个64位变量的写操作将不具有原子性。当单个内存操作不具有原子性时,可能会产生意想不到后果。请看示意图,如图3-15所示。 图3-15 总线事务执行的时序图 如上图所示,假设处理器A写一个long型变量,同时处理器B要读这个long型变量。处理器A中64位的写操作被拆分为两个32位的写操作,且这两个32位的写操作被分配到不同的写事务中执行。同时,处理器B中64位的读操作被分配到单个的读事务中执行。当处理器A和B按上图的时序来执行时,处理器B将看到仅仅被处理器A“写了一半”的无效值。注意,在JSR -133之前的旧内存模型中,一个64位long/double型变量的读/写操作可以被拆分为两个32位的读/写操作来执行。从JSR -133内存模型开始(即从JDK5开始),仅仅只允许把一个64位long/double型变量的写操作拆分为两个32位的写操作来执行,任意的读操作在JSR -133中都必须具有原子性(即任意读操作必须要在单个读事务中执行)。 3.4 volatile的内存语义当声明共享变量为volatile后,对这个变量的读/写将会很特别。为了揭开volatile的神秘面纱,下面将介绍volatile的内存语义及volatile内存语义的实现。 3.4.1 volatile的特性理解volatile特性的一个好方法是把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。下面通过具体的示例来说明,示例代码如下。class VolatileFeaturesExample { volatile long vl = 0L; // 使用volatile声明64位的long型变量 public void set(long l) { vl = l; // 单个volatile变量的写 } public void getAndIncrement () { vl++; // 复合(多个)volatile变量的读/写 } public long get() { return vl; // 单个volatile变量的读 } }假设有多个线程分别调用上面程序的3个方法,这个程序在语义上和下面程序等价。class VolatileFeaturesExample { long vl = 0L; // 64位的long型普通变量 public synchronized void set(long l) { // 对单个的普通变量的写用同一个锁同步 vl = l; } public void getAndIncrement () { // 普通方法调用 long temp = get(); // 调用已同步的读方法 temp += 1L; // 普通写操作 set(temp); // 调用已同步的写方法 } public synchronized long get() { // 对单个的普通变量的读用同一个锁同步 return vl; } }如上面示例程序所示,一个volatile变量的单个读/写操作,与一个普通变量的读/写操作都是使用同一个锁来同步,它们之间的执行效果相同。锁的happens-before规则保证释放锁和获取锁的两个线程之间的内存可见性,这意味着对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。锁的语义决定了临界区代码的执行具有原子性。这意味着,即使是64位的long型和double型变量,只要它是volatile变量,对该变量的读/写就具有原子性。如果是多个volatile操作或类似于volatile++这种复合操作,这些操作整体上不具有原子性。简而言之,volatile变量自身具有下列特性。可见性。对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。 3.4.2 volatile写-读建立的happens-before关系上面讲的是volatile变量自身的特性,对程序员来说,volatile对线程的内存可见性的影响比volatile自身的特性更为重要,也更需要我们去关注。从JSR-133开始(即从JDK5开始),volatile变量的写-读可以实现线程之间的通信。从内存语义的角度来说,volatile的写-读与锁的释放-获取有相同的内存效果:volatile写和锁的释放有相同的内存语义;volatile读与锁的获取有相同的内存语义。请看下面使用volatile变量的示例代码。class VolatileExample { int a = 0; volatile boolean f?lag = false; public void writer() { a = 1; // 1 f?lag = true; // 2 } public void reader() { if (f?lag) { // 3 int i = a; // 4 …… } } }假设线程A执行writer()方法之后,线程B执行reader()方法。根据happens-before规则,这个过程建立的happens-before关系可以分为3类:1)根据程序次序规则,1 happens-before 2; 3 happens-before 4。2)根据volatile规则,2 happens-before 3。3)根据happens-before的传递性规则,1 happens-before 4。上述happens-before关系的图形化表现形式如下。 图3-16 happens-before关系 在上图中,每一个箭头链接的两个节点,代表了一个happens-before关系。黑色箭头表示程序顺序规则;橙色箭头表示volatile规则;蓝色箭头表示组合这些规则后提供的happens-before保证。这里A线程写一个volatile变量后,B线程读同一个volatile变量。A线程在写volatile变量之前所有可见的共享变量,在B线程读同一个volatile变量后,将立即变得对B线程可见。本文统一用粗实线标识组合后产生的happens-before关系。3.4.3 volatile写-读的内存语义volatile写的内存语义如下。当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值刷新到主内存。以上面示例程序VolatileExample为例,假设线程A首先执行writer()方法,随后线程B执行reader()方法,初始时两个线程的本地内存中的f?lag和a都是初始状态。图3-17是线程A执行volatile写后,共享变量的状态示意图。 图3-17 共享变量的状态示意图 如图3-17所示,线程A在写f?lag变量后,本地内存A中被线程A更新过的两个共享变量的值被刷新到主内存中。此时,本地内存A和主内存中的共享变量的值是一致的。volatile读的内存语义如下。当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。 图3-18为线程B读同一个volatile变量后,共享变量的状态示意图。如图所示,在读f?lag变量后,本地内存B包含的值已经被置为无效。此时,线程B必须从主内存中读取共享变量。线程B的读取操作将导致本地内存B与主内存中的共享变量的值变成一致。如果我们把volatile写和volatile读两个步骤综合起来看的话,在读线程B读一个volatile变量后,写线程A在写这个volatile变量之前所有可见的共享变量的值都将立即变得对读线程B可见。下面对volatile写和volatile读的内存语义做个总结。线程A写一个volatile变量,实质上是线程A向接下来将要读这个volatile变量的某个线程发出了(其对共享变量所做修改的)消息。线程B读一个volatile变量,实质上是线程B接收了之前某个线程发出的(在写这个volatile变量之前对共享变量所做修改的)消息。线程A写一个volatile变量,随后线程B读这个volatile变量,这个过程实质上是线程A通过主内存向线程B发送消息。 图3-18 共享变量的状态示意图3.4.4 volatile内存语义的实现下面来看看JMM如何实现volatile写/读的内存语义。前文提到过重排序分为编译器重排序和处理器重排序。为了实现volatile内存语义,JMM会分别限制这两种类型的重排序类型。表3-5是JMM针对编译器制定的volatile重排序规则表。表3-5 volatile重排序规则表 举例来说,第三行最后一个单元格的意思是:在程序中,当第一个操作为普通变量的读或写时,如果第二个操作为volatile写,则编译器不能重排序这两个操作。从表3-5我们可以看出。当第二个操作是volatile写时,不管第一个操作是什么,都不能重排序。这个规则确保volatile写之前的操作不会被编译器重排序到volatile写之后。当第一个操作是volatile读时,不管第二个操作是什么,都不能重排序。这个规则确保volatile读之后的操作不会被编译器重排序到volatile读之前。当第一个操作是volatile写,第二个操作是volatile读时,不能重排序。为了实现volatile的内存语义,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。对于编译器来说,发现一个最优布置来最小化插入屏障的总数几乎不可能。为此,JMM采取保守策略。下面是基于保守策略的JMM内存屏障插入策略。在每个volatile写操作的前面插入一个StoreStore屏障。在每个volatile写操作的后面插入一个StoreLoad屏障。在每个volatile读操作的后面插入一个LoadLoad屏障。在每个volatile读操作的后面插入一个LoadStore屏障。上述内存屏障插入策略非常保守,但它可以保证在任意处理器平台,任意的程序中都能得到正确的volatile内存语义。下面是保守策略下,volatile写插入内存屏障后生成的指令序列示意图,如图3-19所示。 图3-19 指令序列示意图 图3-19中的StoreStore屏障可以保证在volatile写之前,其前面的所有普通写操作已经对任意处理器可见了。这是因为StoreStore屏障将保障上面所有的普通写在volatile写之前刷新到主内存。这里比较有意思的是,volatile写后面的StoreLoad屏障。此屏障的作用是避免volatile写与后面可能有的volatile读/写操作重排序。因为编译器常常无法准确判断在一个volatile写的后面是否需要插入一个StoreLoad屏障(比如,一个volatile写之后方法立即return)。为了保证能正确实现volatile的内存语义,JMM在采取了保守策略:在每个volatile写的后面,或者在每个volatile读的前面插入一个StoreLoad屏障。从整体执行效率的角度考虑,JMM最终选择了在每个volatile写的后面插入一个StoreLoad屏障。因为volatile写-读内存语义的常见使用模式是:一个写线程写volatile变量,多个读线程读同一个volatile变量。当读线程的数量大大超过写线程时,选择在volatile写之后插入StoreLoad屏障将带来可观的执行效率的提升。从这里可以看到JMM在实现上的一个特点:首先确保正确性,然后再去追求执行效率。下面是在保守策略下,volatile读插入内存屏障后生成的指令序列示意图,如图3-20所示。 图3-20 指令序列示意图 图3-20中的LoadLoad屏障用来禁止处理器把上面的volatile读与下面的普通读重排序。LoadStore屏障用来禁止处理器把上面的volatile读与下面的普通写重排序。上述volatile写和volatile读的内存屏障插入策略非常保守。在实际执行时,只要不改变volatile写-读的内存语义,编译器可以根据具体情况省略不必要的屏障。下面通过具体的示例代码进行说明。class VolatileBarrierExample { int a; volatile int v1 = 1; volatile int v2 = 2; void readAndWrite() { int i = v1; // 第一个volatile读 int j = v2; // 第二个volatile读 a = i + j; // 普通写 v1 = i + 1; // 第一个volatile写 v2 = j * 2; // 第二个 volatile写 } … // 其他方法 }针对readAndWrite()方法,编译器在生成字节码时可以做如下的优化。 图3-21 指令序列示意图 注意,最后的StoreLoad屏障不能省略。因为第二个volatile写之后,方法立即return。此时编译器可能无法准确断定后面是否会有volatile读或写,为了安全起见,编译器通常会在这里插入一个StoreLoad屏障。上面的优化针对任意处理器平台,由于不同的处理器有不同“松紧度”的处理器内存模型,内存屏障的插入还可以根据具体的处理器内存模型继续优化。以X86处理器为例,图3-21中除最后的StoreLoad屏障外,其他的屏障都会被省略。前面保守策略下的volatile读和写,在X86处理器平台可以优化成如图3-22所示。前文提到过,X86处理器仅会对写-读操作做重排序。X86不会对读-读、读-写和写-写操作做重排序,因此在X86处理器中会省略掉这3种操作类型对应的内存屏障。在X86中,JMM仅需在volatile写后面插入一个StoreLoad屏障即可正确实现volatile写-读的内存语义。这意味着在X86处理器中,volatile写的开销比volatile读的开销会大很多(因为执行StoreLoad屏障开销会比较大)。 图3-22 指令序列示意图 3.4.5 JSR-133为什么要增强volatile的内存语义在JSR-133之前的旧Java内存模型中,虽然不允许volatile变量之间重排序,但旧的Java内存模型允许volatile变量与普通变量重排序。在旧的内存模型中,VolatileExample示例程序可能被重排序成下列时序来执行,如图3-23所示。 图3-23 线程执行时序图 在旧的内存模型中,当1和2之间没有数据依赖关系时,1和2之间就可能被重排序(3和4类似)。其结果就是:读线程B执行4时,不一定能看到写线程A在执行1时对共享变量的修改。因此,在旧的内存模型中,volatile的写-读没有锁的释放-获所具有的内存语义。为了提供一种比锁更轻量级的线程之间通信的机制,JSR-133专家组决定增强volatile的内存语义:严格限制编译器和处理器对volatile变量与普通变量的重排序,确保volatile的写-读和锁的释放-获取具有相同的内存语义。从编译器重排序规则和处理器内存屏障插入策略来看,只要volatile变量与普通变量之间的重排序可能会破坏volatile的内存语义,这种重排序就会被编译器重排序规则和处理器内存屏障插入策略禁止。由于volatile仅仅保证对单个volatile变量的读/写具有原子性,而锁的互斥执行的特性可以确保对整个临界区代码的执行具有原子性。在功能上,锁比volatile更强大;在可伸缩性和执行性能上,volatile更有优势。如果读者想在程序中用volatile代替锁,请一定谨慎,具体详情请参阅Brian Goetz的文章《Java理论与实践:正确使用Volatile变量》。 3.5 锁的内存语义众所周知,锁可以让临界区互斥执行。这里将介绍锁的另一个同样重要,但常常被忽视的功能:锁的内存语义。 3.5.1 锁的释放-获取建立的happens-before关系锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。下面是锁释放-获取的示例代码。class MonitorExample { int a = 0; public synchronized void writer() { // 1 a++; // 2 } // 3 public synchronized void reader() { // 4 int i = a; // 5 …… } // 6 }假设线程A执行writer()方法,随后线程B执行reader()方法。根据happens-before规则,这个过程包含的happens-before关系可以分为3类。1)根据程序次序规则,1 happens-before 2, 2 happens-before 3; 4 happens-before 5, 5 happens -before 6。2)根据监视器锁规则,3 happens-before 4。3)根据happens-before的传递性,2 happens-before 5。上述happens-before关系的图形化表现形式如图3-24所示。 图3-24 happens-before关系图 在图3-24中,每一个箭头链接的两个节点,代表了一个happens-before关系。黑色箭头表示程序顺序规则;橙色箭头表示监视器锁规则;蓝色箭头表示组合这些规则后提供的happens-before保证。图3-24表示在线程A释放了锁之后,随后线程B获取同一个锁。在上图中,2 happens-before 5。因此,线程A在释放锁之前所有可见的共享变量,在线程B获取同一个锁之后,将立刻变得对B线程可见。 3.5.2 锁的释放和获取的内存语义当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中。以上面的MonitorExample程序为例,A线程释放锁后,共享数据的状态示意图如图3-25所示。 图3-25 共享数据的状态示意图 当线程获取锁时,JMM会把该线程对应的本地内存置为无效。从而使得被监视器保护的临界区代码必须从主内存中读取共享变量。图3-26是锁获取的状态示意图。 图3-26 锁获取的状态示意图 对比锁释放-获取的内存语义与volatile写-读的内存语义可以看出:锁释放与volatile写有相同的内存语义;锁获取与volatile读有相同的内存语义。下面对锁释放和锁获取的内存语义做个总结。线程A释放一个锁,实质上是线程A向接下来将要获取这个锁的某个线程发出了(线程A对共享变量所做修改的)消息。线程B获取一个锁,实质上是线程B接收了之前某个线程发出的(在释放这个锁之前对共享变量所做修改的)消息。线程A释放锁,随后线程B获取这个锁,这个过程实质上是线程A通过主内存向线程B发送消息。 3.5.3 锁内存语义的实现本文将借助ReentrantLock的源代码,来分析锁内存语义的具体实现机制。请看下面的示例代码。class ReentrantLockExample { int a = 0; ReentrantLock lock = new ReentrantLock(); public void writer() { lock.lock(); // 获取锁 try { a++; } f?inally { lock.unlock(); // 释放锁 } } public void reader () { lock.lock(); // 获取锁 try { int i = a; …… } f?inally { lock.unlock(); // 释放锁 } } }在ReentrantLock中,调用lock()方法获取锁;调用unlock()方法释放锁。ReentrantLock的实现依赖于Java同步器框架AbstractQueuedSynchronizer(本文简称之为AQS)。AQS使用一个整型的volatile变量(命名为state)来维护同步状态,马上我们会看到,这个volatile变量是ReentrantLock内存语义实现的关键。图3-27是ReentrantLock的类图(仅画出与本文相关的部分)。 图3-27 ReentrantLock的类图 ReentrantLock分为公平锁和非公平锁,我们首先分析公平锁。使用公平锁时,加锁方法lock()调用轨迹如下。1)ReentrantLock : lock()。2)FairSync : lock()。3)AbstractQueuedSynchronizer : acquire(int arg)。4)ReentrantLock : tryAcquire(int acquires)。在第4步真正开始加锁,下面是该方法的源代码。protected f?inal boolean tryAcquire(int acquires) { f?inal Thread current = Thread.currentThread(); int c = getState(); // 获取锁的开始,首先读volatile变量state if (c == 0) { if (isFirst(current) && compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; }从上面源代码中我们可以看出,加锁方法首先读volatile变量state。在使用公平锁时,解锁方法unlock()调用轨迹如下。1)ReentrantLock : unlock()。2)AbstractQueuedSynchronizer : release(int arg)。3)Sync : tryRelease(int releases)。在第3步真正开始释放锁,下面是该方法的源代码。protected f?inal boolean tryRelease(int releases) { int c = getState() - releases; if (Thread.currentThread() != getExclusiveOwnerThread()) throw new IllegalMonitorStateException(); boolean free = false; if (c == 0) { free = true; setExclusiveOwnerThread(null); } setState(c); // 释放锁的最后,写volatile变量state return free; }从上面的源代码可以看出,在释放锁的最后写volatile变量state。公平锁在释放锁的最后写volatile变量state,在获取锁时首先读这个volatile变量。根据volatile的happens-before规则,释放锁的线程在写volatile变量之前可见的共享变量,在获取锁的线程读取同一个volatile变量后将立即变得对获取锁的线程可见。现在我们来分析非公平锁的内存语义的实现。非公平锁的释放和公平锁完全一样,所以这里仅仅分析非公平锁的获取。使用非公平锁时,加锁方法lock()调用轨迹如下。1)ReentrantLock : lock()。2)NonfairSync : lock()。3)AbstractQueuedSynchronizer : compareAndSetState(int expect, int update)。在第3步真正开始加锁,下面是该方法的源代码。protected f?inal boolean compareAndSetState(int expect, int update) { return unsafe.compareAndSwapInt(this, stateOffset, expect, update); }该方法以原子操作的方式更新state变量,本文把Java的compareAndSet()方法调用简称为CAS。JDK文档对该方法的说明如下:如果当前状态值等于预期值,则以原子方式将同步状态设置为给定的更新值。此操作具有volatile读和写的内存语义。这里我们分别从编译器和处理器的角度来分析,CAS如何同时具有volatile读和volatile写的内存语义。前文我们提到过,编译器不会对volatile读与volatile读后面的任意内存操作重排序;编译器不会对volatile写与volatile写前面的任意内存操作重排序。组合这两个条件,意味着为了同时实现volatile读和volatile写的内存语义,编译器不能对CAS与CAS前面和后面的任意内存操作重排序。下面我们来分析在常见的intel X86处理器中,CAS是如何同时具有volatile读和volatile写的内存语义的。下面是sun.misc.Unsafe类的compareAndSwapInt()方法的源代码。 public f?inal native boolean compareAndSwapInt(Object o, long offset, int expected, int x); 可以看到,这是一个本地方法调用。这个本地方法在openjdk中依次调用的c++代码为:unsafe.cpp,atomic.cpp和atomic_windows_x86.inline.hpp。这个本地方法的最终实现在openjdk的如下位置:openjdk-7-fcs-src-b147-27_jun_2011openjdkhotspotsrcos_cpuwindows_x86vm atomic_windows_x86.inline.hpp(对应于Windows操作系统,X86处理器)。下面是对应于intel X86处理器的源代码的片段。inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) { // alternative for InterlockedCompareExchange int mp = os::is_MP(); __asm { mov edx, dest mov ecx, exchange_value mov eax, compare_value LOCK_IF_MP(mp) cmpxchg dword ptr [edx], ecx }}如上面源代码所示,程序会根据当前处理器的类型来决定是否为cmpxchg指令添加lock前缀。如果程序是在多处理器上运行,就为cmpxchg指令加上lock前缀(Lock Cmpxchg)。反之,如果程序是在单处理器上运行,就省略lock前缀(单处理器自身会维护单处理器内的顺序一致性,不需要lock前缀提供的内存屏障效果)。intel的手册对lock前缀的说明如下。1)确保对内存的读-改-写操作原子执行。在Pentium及Pentium之前的处理器中,带有lock前缀的指令在执行期间会锁住总线,使得其他处理器暂时无法通过总线访问内存。很显然,这会带来昂贵的开销。从Pentium 4、Intel Xeon及P6处理器开始,Intel使用缓存锁定(Cache Locking)来保证指令执行的原子性。缓存锁定将大大降低lock前缀指令的执行开销。2)禁止该指令,与之前和之后的读和写指令重排序。3)把写缓冲区中的所有数据刷新到内存中。上面的第2点和第3点所具有的内存屏障效果,足以同时实现volatile读和volatile写的内存语义。经过上面的分析,现在我们终于能明白为什么JDK文档说CAS同时具有volatile读和volatile写的内存语义了。现在对公平锁和非公平锁的内存语义做个总结。公平锁和非公平锁释放时,最后都要写一个volatile变量state。公平锁获取时,首先会去读volatile变量。非公平锁获取时,首先会用CAS更新volatile变量,这个操作同时具有volatile读和volatile写的内存语义。从本文对ReentrantLock的分析可以看出,锁释放-获取的内存语义的实现至少有下面两种方式。1)利用volatile变量的写-读所具有的内存语义。2)利用CAS所附带的volatile读和volatile写的内存语义。 3.5.4 concurrent包的实现由于Java的CAS同时具有volatile读和volatile写的内存语义,因此Java线程之间的通信现在有了下面4种方式。1)A线程写volatile变量,随后B线程读这个volatile变量。2)A线程写volatile变量,随后B线程用CAS更新这个volatile变量。3)A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量。4)A线程用CAS更新一个volatile变量,随后B线程读这个volatile变量。Java的CAS会使用现代处理器上提供的高效机器级别的原子指令,这些原子指令以原子方式对内存执行读-改-写操作,这是在多处理器中实现同步的关键(从本质上来说,能够支持原子性读-改-写指令的计算机,是顺序计算图灵机的异步等价机器,因此任何现代的多处理器都会去支持某种能对内存执行原子性读-改-写操作的原子指令)。同时,volatile变量的读/写和CAS可以实现线程之间的通信。把这些特性整合在一起,就形成了整个concurrent包得以实现的基石。如果我们仔细分析concurrent包的源代码实现,会发现一个通用化的实现模式。首先,声明共享变量为volatile。然后,使用CAS的原子条件更新来实现线程之间的同步。同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的通信。AQS,非阻塞数据结构和原子变量类(java.util.concurrent.atomic包中的类),这些concurrent包中的基础类都是使用这种模式来实现的,而concurrent包中的高层类又是依赖于这些基础类来实现的。从整体来看,concurrent包的实现示意图如3-28所示。 图3-28 concurrent包的实现示意图 3.6 f?inal域的内存语义与前面介绍的锁和volatile相比,对f?inal域的读和写更像是普通的变量访问。下面将介绍f?inal域的内存语义。 3.6.1 f?inal域的重排序规则对于f?inal域,编译器和处理器要遵守两个重排序规则。1)在构造函数内对一个f?inal域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。2)初次读一个包含f?inal域的对象的引用,与随后初次读这个f?inal域,这两个操作之间不能重排序。下面通过一些示例性的代码来分别说明这两个规则。public class FinalExample { int i; // 普通变量 f?inal int j; // f?inal变量 static FinalExample obj; public FinalExample () { // 构造函数 i = 1; // 写普通域 j = 2; // 写f?inal域 } public static void writer () { // 写线程A执行 obj = new FinalExample (); } public static void reader () { // 读线程B执行 FinalExample object = obj; // 读对象引用 int a = object.i; // 读普通域 int b = object.j; // 读f?inal域 } }这里假设一个线程A执行writer()方法,随后另一个线程B执行reader()方法。下面我们通过这两个线程的交互来说明这两个规则。 3.6.2 写f?inal域的重排序规则写f?inal域的重排序规则禁止把f?inal域的写重排序到构造函数之外。这个规则的实现包含下面2个方面。1)JMM禁止编译器把f?inal域的写重排序到构造函数之外。2)编译器会在f?inal域的写之后,构造函数return之前,插入一个StoreStore屏障。这个屏障禁止处理器把f?inal域的写重排序到构造函数之外。现在让我们分析writer()方法。writer()方法只包含一行代码:f?inalExample = new FinalExample()。这行代码包含两个步骤,如下。1)构造一个FinalExample类型的对象。2)把这个对象的引用赋值给引用变量obj。假设线程B读对象引用与读对象的成员域之间没有重排序(马上会说明为什么需要这个假设),图3-29是一种可能的执行时序。在图3-29中,写普通域的操作被编译器重排序到了构造函数之外,读线程B错误地读取了普通变量i初始化之前的值。而写f?inal域的操作,被写f?inal域的重排序规则“限定”在了构造函数之内,读线程B正确地读取了f?inal变量初始化之后的值。写f?inal域的重排序规则可以确保:在对象引用为任意线程可见之前,对象的f?inal域已经被正确初始化过了,而普通域不具有这个保障。以上图为例,在读线程B“看到”对象引用obj时,很可能obj对象还没有构造完成(对普通域i的写操作被重排序到构造函数外,此时初始值1还没有写入普通域i)。 图3-29 线程执行时序图 3.6.3 读f?inal域的重排序规则读f?inal域的重排序规则是,在一个线程中,初次读对象引用与初次读该对象包含的f?inal域,JMM禁止处理器重排序这两个操作(注意,这个规则仅仅针对处理器)。编译器会在读f?inal域操作的前面插入一个LoadLoad屏障。初次读对象引用与初次读该对象包含的f?inal域,这两个操作之间存在间接依赖关系。由于编译器遵守间接依赖关系,因此编译器不会重排序这两个操作。大多数处理器也会遵守间接依赖,也不会重排序这两个操作。但有少数处理器允许对存在间接依赖关系的操作做重排序(比如alpha处理器),这个规则就是专门用来针对这种处理器的。reader()方法包含3个操作。初次读引用变量obj。初次读引用变量obj指向对象的普通域j。初次读引用变量obj指向对象的f?inal域i。现在假设写线程A没有发生任何重排序,同时程序在不遵守间接依赖的处理器上执行,图3-30所示是一种可能的执行时序。 图3-30 线程执行时序图 在图3-30中,读对象的普通域的操作被处理器重排序到读对象引用之前。读普通域时,该域还没有被写线程A写入,这是一个错误的读取操作。而读f?inal域的重排序规则会把读对象f?inal域的操作“限定”在读对象引用之后,此时该f?inal域已经被A线程初始化过了,这是一个正确的读取操作。读f?inal域的重排序规则可以确保:在读一个对象的f?inal域之前,一定会先读包含这个f?inal域的对象的引用。在这个示例程序中,如果该引用不为null,那么引用对象的f?inal域一定已经被A线程初始化过了。 3.6.4 final域为引用类型上面我们看到的f?inal域是基础数据类型,如果f?inal域是引用类型,将会有什么效果?请看下列示例代码。public class FinalReferenceExample { f?inal int[] intArray; // f?inal是引用类型 static FinalReferenceExample obj; public FinalReferenceExample () { // 构造函数 intArray = new int[1]; // 1 intArray[0] = 1; // 2 } public static void writerOne () { // 写线程A执行 obj = new FinalReferenceExample (); // 3 } public static void writerTwo () { // 写线程B执行 obj.intArray[0] = 2; // 4 } public static void reader () { // 读线程C执行 if (obj != null) { // 5 int temp1 = obj.intArray[0]; // 6 } } }本例f?inal域为一个引用类型,它引用一个int型的数组对象。对于引用类型,写f?inal域的重排序规则对编译器和处理器增加了如下约束:在构造函数内对一个f?inal引用的对象的成员域的写入,与随后在构造函数外把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。对上面的示例程序,假设首先线程A执行writerOne()方法,执行完后线程B执行writerTwo()方法,执行完后线程C执行reader()方法。图3-31是一种可能的线程执行时序。 在图3-31中,1是对f?inal域的写入,2是对这个f?inal域引用的对象的成员域的写入,3是把被构造的对象的引用赋值给某个引用变量。这里除了前面提到的1不能和3重排序外,2和3也不能重排序。JMM可以确保读线程C至少能看到写线程A在构造函数中对f?inal引用对象的成员域的写入。即C至少能看到数组下标0的值为1。而写线程B对数组元素的写入,读线程C可能看得到,也可能看不到。JMM不保证线程B的写入对读线程C可见,因为写线程B和读线程C之间存在数据竞争,此时的执行结果不可预知。如果想要确保读线程C看到写线程B对数组元素的写入,写线程B和读线程C之间需要使用同步原语(lock或volatile)来确保内存可见性。 3.6.5 为什么f?inal引用不能从构造函数内“溢出”前面我们提到过,写f?inal域的重排序规则可以确保:在引用变量为任意线程可见之前,该引用变量指向的对象的f?inal域已经在构造函数中被正确初始化过了。其实,要得到这个效果,还需要一个保证:在构造函数内部,不能让这个被构造对象的引用为其他线程所见,也就是对象引用不能在构造函数中“逸出”。为了说明问题,让我们来看下面的示例代码。public class FinalReferenceEscapeExample { f?inal int i; static FinalReferenceEscapeExample obj; public FinalReferenceEscapeExample () { i = 1; // 1写f?inal域 obj = this; // 2 this引用在此"逸出" } public static void writer() { new FinalReferenceEscapeExample (); } public static void reader() { if (obj != null) { // 3 int temp = obj.i; // 4 } } } 图3-31 引用型f?inal的执行时序图 假设一个线程A执行writer()方法,另一个线程B执行reader()方法。这里的操作2使得对象还未完成构造前就为线程B可见。即使这里的操作2是构造函数的最后一步,且在程序中操作2排在操作1后面,执行read()方法的线程仍然可能无法看到f?inal域被初始化后的值,因为这里的操作1和操作2之间可能被重排序。实际的执行时序可能如图3-32所示。 图3-32 多线程执行时序图 从图3-32可以看出:在构造函数返回前,被构造对象的引用不能为其他线程所见,因为此时的f?inal域可能还没有被初始化。在构造函数返回后,任意线程都将保证能看到f?inal域正确初始化之后的值。 3.6.6 f?inal语义在处理器中的实现现在我们以X86处理器为例,说明f?inal语义在处理器中的具体实现。上面我们提到,写f?inal域的重排序规则会要求编译器在f?inal域的写之后,构造函数return之前插入一个StoreStore障屏。读f?inal域的重排序规则要求编译器在读f?inal域的操作前面插入一个LoadLoad屏障。由于X86处理器不会对写-写操作做重排序,所以在X86处理器中,写f?inal域需要的StoreStore障屏会被省略掉。同样,由于X86处理器不会对存在间接依赖关系的操作做重排序,所以在X86处理器中,读f?inal域需要的LoadLoad屏障也会被省略掉。也就是说,在X86处理器中,f?inal域的读/写不会插入任何内存屏障! 3.6.7 JSR-133为什么要增强f?inal的语义在旧的Java内存模型中,一个最严重的缺陷就是线程可能看到f?inal域的值会改变。比如,一个线程当前看到一个整型f?inal域的值为0(还未初始化之前的默认值),过一段时间之后这个线程再去读这个f?inal域的值时,却发现值变为1(被某个线程初始化之后的值)。最常见的例子就是在旧的Java内存模型中,String的值可能会改变。为了修补这个漏洞,JSR-133专家组增强了f?inal的语义。通过为f?inal域增加写和读重排序规则,可以为Java程序员提供初始化安全保证:只要对象是正确构造的(被构造对象的引用在构造函数中没有“逸出”),那么不需要使用同步(指lock和volatile的使用)就可以保证任意线程都能看到这个f?inal域在构造函数中被初始化之后的值。
点击这里查看第一章:并发编程的挑战点击这里查看第三章:Java内存模型 第2章:Java并发机制的底层实现原理 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。本章我们将深入底层一起探索下Java并发机制的底层实现原理。 2.1 volatile的应用 在多线程并发编程中synchronized和volatile都扮演着重要的角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。本文将深入分析在硬件层面上Intel处理器是如何实现volatile的,通过深入分析帮助我们正确地使用volatile变量。我们先从了解volatile的定义开始。 1.volatile的定义与实现原理Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。在了解volatile实现原理之前,我们先来看下与其实现原理相关的CPU术语与说明。表2-1是CPU术语的定义。 表2-1 CPU的术语定义 术语 英文单词 术语描述 内存屏障 memory barriers 是一组处理器指令,用于实现对内存操作的顺序限制 缓冲行 cache line 缓存中可以分配的最小存储单位。处理器填写缓存线时会加载整个缓存线,需要使用多个主内存读周期 原子操作 atomic operations 不可中断的一个或一系列操作 缓存行填充 cache line f?ill 当处理器识别到从内存中读取操作数是可缓存的,处理器读取整个缓存行到适当的缓存(L1,L2,L3的或所有) 缓存命中 cache hit 如果进行高速缓存行填充操作的内存位置仍然是下次处理器访问的地址时,处理器从缓存中读取操作数,而不是从内存读取 写命中 write hit 当处理器将操作数写回到一个内存缓存的区域时,它首先会检查这个缓存的内存地址是否在缓存行中,如果存在一个有效的缓存行,则处理器将这个操作数写回到缓存,而不是写回到内存,这个操作被称为写命中 写缺失 write misses the cache 一个有效的缓存行被写入到不存在的内存区域 volatile是如何来保证可见性的呢?让我们在X86处理器下通过工具获取JIT编译器生成的汇编指令来查看对volatile进行写操作时,CPU会做什么事情。Java代码如下。instance = new Singleton(); // instance是volatile变量转变成汇编代码,如下。0x01a3de1d: movb $0×0,0×1104800(%esi);0x01a3de24: lock addl $0×0,(%esp);有volatile变量修饰的共享变量进行写操作的时候会多出第二行汇编代码,通过查IA-32架构软件开发者手册可知,Lock前缀的指令在多核处理器下会引发了两件事情。1)将当前处理器缓存行的数据写回到系统内存。2)这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效。为了提高处理速度,处理器不直接和内存进行通信,而是先将系统内存的数据读到内部缓存(L1,L2或其他)后再进行操作,但操作完不知道何时会写到内存。如果对声明了volatile的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存。但是,就算写回到内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题。所以,在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存里。下面来具体讲解volatile的两条实现原则。1)Lock前缀指令会引起处理器缓存回写到内存。Lock前缀指令导致在执行指令期间,声言处理器的LOCK#信号。在多处理器环境中,LOCK#信号确保在声言该信号期间,处理器可以独占任何共享内存。但是,在最近的处理器里,LOCK#信号一般不锁总线,而是锁缓存,毕竟锁总线开销的比较大。在8.1.4节有详细说明锁定操作对处理器缓存的影响,对于Intel486和Pentium处理器,在锁操作时,总是在总线上声言LOCK#信号。但在P6和目前的处理器中,如果访问的内存区域已经缓存在处理器内部,则不会声言LOCK#信号。相反,它会锁定这块内存区域的缓存并回写到内存,并使用缓存一致性机制来确保修改的原子性,此操作被称为“缓存锁定”,缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据。2)一个处理器的缓存回写到内存会导致其他处理器的缓存无效。IA-32处理器和Intel 64处理器使用MESI(修改、独占、共享、无效)控制协议去维护内部缓存和其他处理器缓存的一致性。在多核处理器系统中进行操作的时候,IA-32和Intel 64处理器能嗅探其他处理器访问系统内存和它们的内部缓存。处理器使用嗅探技术保证它的内部缓存、系统内存和其他处理器的缓存的数据在总线上保持一致。例如,在Pentium和P6 family处理器中,如果通过嗅探一个处理器来检测其他处理器打算写内存地址,而这个地址当前处于共享状态,那么正在嗅探的处理器将使它的缓存行无效,在下次访问相同内存地址时,强制执行缓存行填充。 2.volatile的使用优化著名的Java并发编程大师Doug lea在JDK 7的并发包里新增一个队列集合类Linked-TransferQueue,它在使用volatile变量时,用一种追加字节的方式来优化队列出队和入队的性能。LinkedTransferQueue的代码如下。/* 队列中的头部节点 /private transient f?inal PaddedAtomicReference head;/* 队列中的尾部节点 /private transient f?inal PaddedAtomicReference tail;static f?inal class PaddedAtomicReference extends AtomicReference { // 使用很多4个字节的引用追加到64个字节 Object p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, pa, pb, pc, pd, pe; PaddedAtomicReference(T r) { super(r); }}public class AtomicReference implements java.io.Serializable { private volatile V value; // 省略其他代码} 追加字节能优化性能?这种方式看起来很神奇,但如果深入理解处理器架构就能理解其中的奥秘。让我们先来看看LinkedTransferQueue这个类,它使用一个内部类类型来定义队列的头节点(head)和尾节点(tail),而这个内部类PaddedAtomicReference相对于父类AtomicReference只做了一件事情,就是将共享变量追加到64字节。我们可以来计算下,一个对象的引用占4个字节,它追加了15个变量(共占60个字节),再加上父类的value变量,一共64个字节。为什么追加64字节能够提高并发编程的效率呢?因为对于英特尔酷睿i7、酷睿、Atom和NetBurst,以及Core Solo和Pentium M处理器的L1、L2或L3缓存的高速缓存行是64个字节宽,不支持部分填充缓存行,这意味着,如果队列的头节点和尾节点都不足64字节的话,处理器会将它们都读到同一个高速缓存行中,在多处理器下每个处理器都会缓存同样的头、尾节点,当一个处理器试图修改头节点时,会将整个缓存行锁定,那么在缓存一致性机制的作用下,会导致其他处理器不能访问自己高速缓存中的尾节点,而队列的入队和出队操作则需要不停修改头节点和尾节点,所以在多处理器的情况下将会严重影响到队列的入队和出队效率。Doug lea使用追加到64字节的方式来填满高速缓冲区的缓存行,避免头节点和尾节点加载到同一个缓存行,使头、尾节点在修改时不会互相锁定。那么是不是在使用volatile变量时都应该追加到64字节呢?不是的。在两种场景下不应该使用这种方式。缓存行非64字节宽的处理器。如P6系列和奔腾处理器,它们的L1和L2高速缓存行是32个字节宽。共享变量不会被频繁地写。因为使用追加字节的方式需要处理器读取更多的字节到高速缓冲区,这本身就会带来一定的性能消耗,如果共享变量不被频繁写的话,锁的几率也非常小,就没必要通过追加字节的方式来避免相互锁定。不过这种追加字节的方式在Java 7下可能不生效,因为Java 7变得更加智慧,它会淘汰或重新排列无用字段,需要使用其他追加字节的方式。除了volatile,Java并发编程中应用较多的是synchronized,下面一起来看一下。 2.2 synchronized的实现原理与应用在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。本文详细介绍Java SE 1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现为以下3种形式。对于普通同步方法,锁是当前实例对象。对于静态同步方法,锁是当前类的Class对象。对于同步方法块,锁是Synchonized括号里配置的对象。当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。那么锁到底存在哪里呢?锁里面会存储什么信息呢?从JVM规范中可以看到Synchonized在JVM里的实现原理,JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter和monitorexit指令实现的,而方法同步是使用另外一种方式实现的,细节在JVM规范里并没有详细说明。但是,方法的同步同样可以使用这两个指令来实现。monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处,JVM要保证每个monitorenter必须有对应的monitorexit与之配对。任何对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态。线程执行到monitorenter指令时,将会尝试获取对象所对应的monitor的所有权,即尝试获得对象的锁。 2.2.1 Java对象头synchronized用的锁是存在Java对象头里的。如果对象是数组类型,则虚拟机用3个字宽(Word)存储对象头,如果对象是非数组类型,则用2字宽存储对象头。在32位虚拟机中,1字宽等于4字节,即32bit,如表2-2所示。 表2-2 Java对象头的长度 长 度 内 容 说 明 32/64bit Mark Word 存储对象的hashCode或锁信息等 32/64bit Class Metadata Address 存储到对象类型数据的指针 32/32bit Array length 数组的长度(如果当前对象是数组) Java对象头里的Mark Word里默认存储对象的HashCode、分代年龄和锁标记位。32位JVM的Mark Word的默认存储结构如表2-3所示。 表2-3 Java对象头的存储结构 锁状态 25bit 4bit 1bit是否是偏向锁 2bit锁标志位 无锁状态 对象的hashCode 对象分代年龄 0 01 在运行期间,Mark Word里存储的数据会随着锁标志位的变化而变化。Mark Word可能变化为存储以下4种数据,如表2-4所示。 表2-4 Mark Word的状态变化 在64位虚拟机下,Mark Word是64bit大小的,其存储结构如表2-5所示。 表2-5 Mark Word的存储结构 2.2.2 锁的升级与对比Java SE 1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,在Java SE 1.6中,锁一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率,下文会详细分析。 1.偏向锁HotSpot的作者经过研究发现,大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储锁偏向的线程ID,以后该线程在进入和退出同步块时不需要进行CAS操作来加锁和解锁,只需简单地测试一下对象头的Mark Word里是否存储着指向当前线程的偏向锁。如果测试成功,表示线程已经获得了锁。如果测试失败,则需要再测试一下Mark Word中偏向锁的标识是否设置成1(表示当前是偏向锁):如果没有设置,则使用CAS竞争锁;如果设置了,则尝试使用CAS将对象头的偏向锁指向当前线程。(1)偏向锁的撤销偏向锁使用了一种等到竞争出现才释放锁的机制,所以当其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁。偏向锁的撤销,需要等待全局安全点(在这个时间点上没有正在执行的字节码)。它会首先暂停拥有偏向锁的线程,然后检查持有偏向锁的线程是否活着,如果线程不处于活动状态,则将对象头设置成无锁状态;如果线程仍然活着,拥有偏向锁的栈会被执行,遍历偏向对象的锁记录,栈中的锁记录和对象头的Mark Word要么重新偏向于其他线程,要么恢复到无锁或者标记对象不适合作为偏向锁,最后唤醒暂停的线程。图2-1中的线程1演示了偏向锁初始化的流程,线程2演示了偏向锁撤销的流程。 图2-1 偏向锁初始化的流程 (2)关闭偏向锁偏向锁在Java 6和Java 7里是默认启用的,但是它在应用程序启动几秒钟之后才激活,如有必要可以使用JVM参数来关闭延迟:-XX:BiasedLockingStartupDelay=0。如果你确定应用程序里所有的锁通常情况下处于竞争状态,可以通过JVM参数关闭偏向锁:-XX:-UseBiasedLocking=false,那么程序默认会进入轻量级锁状态。2.?轻量级锁(1)轻量级锁加锁线程在执行同步块之前,JVM会先在当前线程的栈桢中创建用于存储锁记录的空间,并将对象头中的Mark Word复制到锁记录中,官方称为Displaced Mark Word。然后线程尝试使用CAS将对象头中的Mark Word替换为指向锁记录的指针。如果成功,当前线程获得锁,如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁。(2)轻量级锁解锁轻量级解锁时,会使用原子的CAS操作将Displaced Mark Word替换回到对象头,如果成功,则表示没有竞争发生。如果失败,表示当前锁存在竞争,锁就会膨胀成重量级锁。图2-2是两个线程同时争夺锁,导致锁膨胀的流程图。 图2-2 争夺锁导致的锁膨胀流程图 因为自旋会消耗CPU,为了避免无用的自旋(比如获得锁的线程被阻塞住了),一旦锁升级成重量级锁,就不会再恢复到轻量级锁状态。当锁处于这个状态下,其他线程试图获取锁时,都会被阻塞住,当持有锁的线程释放锁之后会唤醒这些线程,被唤醒的线程就会进行新一轮的夺锁之争。 3.锁的优缺点对比表2-6是锁的优缺点的对比。表2-6 锁的优缺点的对比锁 优 点 缺 点 适用场景偏向锁 加锁和解锁不需要额外的消耗,和执行非同步方法相比仅存在纳秒级的差距 如果线程间存在锁竞争,会带来额外的锁撤销的消耗 适用于只有一个线程访问同步块场景轻量级锁 竞争的线程不会阻塞,提高了程序的响应速度 如果始终得不到锁竞争的线程,使用自旋会消耗CPU 追求响应时间同步块执行速度非常快重量级锁 线程竞争不使用自旋,不会消耗CPU 线程阻塞,响应时间缓慢 追求吞吐量同步块执行速度较长 2.3 原子操作的实现原理 原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。在多处理器上实现原子操作就变得有点复杂。让我们一起来聊一聊在Intel处理器和Java里是如何实现原子操作的。 1.术语定义在了解原子操作的实现原理前,先要了解一下相关的术语,如表2-7所示。表2-7 CPU术语定义 术语名称 英 文 解 释 缓存行 Cache line 缓存的最小操作单位 比较并交换 Compare and Swap CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换 CPU流水线 CPU pipeline CPU流水线的工作方式就像工业生产上的装配流水线,在CPU中由5~6个不同功能的电路单元组成一条指令处理流水线,然后将一条X86指令分成5~6步后再由这些电路单元分别执行,这样就能实现在一个CPU时钟周期完成一条指令,因此提高CPU的运算速度 内存顺序冲突 Memory order violation 内存顺序冲突一般是由假共享引起的,假共享是指多个CPU同时修改同一个缓存行的不同部分而引起其中一个CPU的操作无效,当出现这个内存顺序冲突时,CPU必须清空流水线 2.处理器如何实现原子操作32位IA-32处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。首先处理器会自动保证基本的内存操作的原子性。处理器保证从系统内存中读取或者写入一个字节是原子的,意思是当一个处理器读取一个字节时,其他处理器不能访问这个字节的内存地址。Pentium 6和最新的处理器能自动保证单处理器对同一个缓存行里进行16/32/64位的操作是原子的,但是复杂的内存操作处理器是不能自动保证其原子性的,比如跨总线宽度、跨多个缓存行和跨页表的访问。但是,处理器提供总线锁定和缓存锁定两个机制来保证复杂内存操作的原子性。(1)使用总线锁保证原子性第一个机制是通过总线锁保证原子性。如果多个处理器同时对共享变量进行读改写操作(i++就是经典的读改写操作),那么共享变量就会被多个处理器同时进行操作,这样读改写操作就不是原子的,操作完之后共享变量的值会和期望的不一致。举个例子,如果i=1,我们进行两次i++操作,我们期望的结果是3,但是有可能结果是2,如图2-3所示。原因可能是多个处理器同时从各自的缓存中读取变量i,分别进行加1操作,然后分别写入系统内存中。那么,想要保证读改写共享变量的操作是原子的,就必须保证CPU1读改写共享变量的时候,CPU2不能操作缓存了该共享变量内存地址的缓存。处理器使用总线锁就是来解决这个问题的。所谓总线锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存。(2)使用缓存锁保证原子性第二个机制是通过缓存锁定来保证原子性。在同一时刻,我们只需保证对某个内存地址的操作是原子性即可,但总线锁定把CPU和内存之间的通信锁住了,这使得锁定期间,其他处理器不能操作其他内存地址的数据,所以总线锁定的开销比较大,目前处理器在某些场合下使用缓存锁定代替总线锁定来进行优化。频繁使用的内存会缓存在处理器的L1、L2和L3高速缓存里,那么原子操作就可以直接在处理器内部缓存中进行,并不需要声明总线锁,在Pentium 6和目前的处理器中可以使用“缓存锁定”的方式来实现复杂的原子性。所谓“缓存锁定”是指内存区域如果被缓存在处理器的缓存行中,并且在Lock操作期间被锁定,那么当它执行锁操作回写到内存时,处理器不在总线上声言LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时,会使缓存行无效,在如图2-3所示的例子中,当CPU1修改缓存行中的i时使用了缓存锁定,那么CPU2就不能同时缓存i的缓存行。但是有两种情况下处理器不会使用缓存锁定。第一种情况是:当操作的数据不能被缓存在处理器内部,或操作的数据跨多个缓存行(cache line)时,则处理器会调用总线锁定。第二种情况是:有些处理器不支持缓存锁定。对于Intel 486和Pentium处理器,就算锁定的内存区域在处理器的缓存行中也会调用总线锁定。针对以上两个机制,我们通过Intel处理器提供了很多Lock前缀的指令来实现。例如,位测试和修改指令:BTS、BTR、BTC;交换指令XADD、CMPXCHG,以及其他一些操作数和逻辑指令(如ADD、OR)等,被这些指令操作的内存区域就会加锁,导致其他处理器不能同时访问它。 3.Java如何实现原子操作在Java中可以通过锁和循环CAS的方式来实现原子操作。(1)使用循环CAS实现原子操作JVM中的CAS操作正是利用了处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止,以下代码实现了一个基于CAS线程安全的计数器方法safeCount和一个非线程安全的计数器count。 private AtomicInteger atomicI = new AtomicInteger(0); private int i = 0; public static void main(String[] args) { f?inal Counter cas = new Counter(); List<Thread> ts = new ArrayList<Thread>(600); long start = System.currentTimeMillis(); for (int j = 0; j < 100; j++) { Thread t = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10000; i++) { cas.count(); cas.safeCount(); } } }); ts.add(t); } for (Thread t : ts) { t.start(); } // 等待所有线程执行完成 for (Thread t : ts) { try { t.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(cas.i); System.out.println(cas.atomicI.get()); System.out.println(System.currentTimeMillis() - start); } /** * 使用CAS实现线程安全计数器 */ private void safeCount() { for (;;) { int i = atomicI.get(); boolean suc = atomicI.compareAndSet(i, ++i); if (suc) { break; } } } /** * 非线程安全计数器 */ private void count() { i++; } } 从Java 1.5开始,JDK的并发包里提供了一些类来支持原子操作,如AtomicBoolean(用原子方式更新的boolean值)、AtomicInteger(用原子方式更新的int值)和AtomicLong(用原子方式更新的long值)。这些原子包装类还提供了有用的工具方法,比如以原子的方式将当前值自增1和自减1。(2)CAS实现原子操作的三大问题在Java并发包中有一些并发框架也使用了自旋CAS的方式来实现原子操作,比如LinkedTransferQueue类的Xfer方法。CAS虽然很高效地解决了原子操作,但是CAS仍然存在三大问题。ABA问题,循环时间长开销大,以及只能保证一个共享变量的原子操作。1)ABA问题。因为CAS需要在操作值的时候,检查值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。ABA问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加1,那么A→B→A就会变成1A→2B→3A。从Java 1.5开始,JDK的Atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法的作用是首先检查当前引用是否等于预期引用,并且检查当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。public boolean compareAndSet( V expectedReference, // 预期引用 V newReference, // 更新后的引用 int expectedStamp, // 预期标志 int newStamp // 更新后的标志 )2)循环时间长开销大。自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。如果JVM能支持处理器提供的pause指令,那么效率会有一定的提升。pause指令有两个作用:第一,它可以延迟流水线执行指令(de-pipeline),使CPU不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零;第二,它可以避免在退出循环的时候因内存顺序冲突(Memory Order Violation)而引起CPU流水线被清空(CPU Pipeline Flush),从而提高CPU的执行效率。3)只能保证一个共享变量的原子操作。当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁。还有一个取巧的办法,就是把多个共享变量合并成一个共享变量来操作。比如,有两个共享变量i=2,j=a,合并一下ij=2a,然后用CAS来操作ij。从Java 1.5开始,JDK提供了AtomicReference类来保证引用对象之间的原子性,就可以把多个变量放在一个对象里来进行CAS操作。(3)使用锁机制实现原子操作锁机制保证了只有获得锁的线程才能够操作锁定的内存区域。JVM内部实现了很多种锁机制,有偏向锁、轻量级锁和互斥锁。有意思的是除了偏向锁,JVM实现锁的方式都用了循环CAS,即当一个线程想进入同步块的时候使用循环CAS的方式来获取锁,当它退出同步块的时候使用循环CAS释放锁。 2.4 本章小结本章我们一起研究了volatile、synchronized和原子操作的实现原理。Java中的大部分容器和框架都依赖于本章介绍的volatile和原子操作的实现原理,了解这些原理对我们进行并发编程会更有帮助。
Java核心技术系列点击这里查看第二章:Java并发机制的底层实现原理点击这里查看第三章:Java内存模型 Java并发编程的艺术 方腾飞 魏鹏 程晓明 著 前 言 为什么要写这本书记得第一次写并发编程的文章时还是在2012年,当时花了几个星期的时间写了一篇文章《深入分析volatile的实现原理》,准备在自己的博客中发表。在同事建法的建议下,怀着试一试的心态投向了InfoQ,庆幸的是半小时后得到InfoQ主编采纳的回复,高兴之情无以言表。这也是我第一次在专业媒体上发表文章,而后在InfoQ编辑张龙的不断鼓励和支持下,我陆续在InfoQ发表了几篇与并发编程相关的文章,于是便形成了“聊聊并发”专栏。在这个专栏的写作过程中,我得到快速的成长和非常多的帮助,在此非常感谢InfoQ的编辑们。2013年,华章的福川兄找到我,问有没有兴趣写一本书,当时觉得自己资历尚浅,婉言拒绝了。后来和福川兄一直保持联系,最后允许我花两年的时间来完成本书,所以答应了下来。由于并发编程领域的技术点非常多且深,所以陆续又邀请了同事魏鹏和朋友晓明一起参与到本书的编写当中。 写本书的过程也是对自己研究和掌握的技术点进行整理的过程,希望本书能帮助读者快速掌握并发编程技术。 本书一共11章,由三名作者共同编写完成,其中第3章和第10章节由程晓明编写,第4章和第5章由魏鹏编写,其他7章由方腾飞编写。 本书特色本书结合JDK的源码介绍了Java并发框架、线程池的实现原理,帮助读者做到知其所以然。 本书对原理的剖析不仅仅局限于Java层面,而是深入到JVM,甚至CPU层面来进行讲解,帮助读者从更底层看并发技术。 本书结合线上应用,给出了一些并发编程实战技巧,以及线上处理并发问题的步骤和思路。 读者对象Java开发工程师架构师并发编程爱好者开设相关课程的大专院校师生 如何阅读本书阅读本书之前,你必须有一定的Java基础和开发经验,最好还有一定的并发编程基础。如果你是一名并发编程初学者,建议按照顺序阅读本书,并按照书中的例子进行编码和实战。如果你有一定的并发编程经验,可以把本书当做一个手册,直接看需要学习的章节。以下是各章节的基本介绍。 第1章介绍Java并发编程的挑战,向读者说明进入并发编程的世界可能会遇到哪些问题,以及如何解决。第2章介绍Java并发编程的底层实现原理,介绍在CPU和JVM这个层面是如何帮助Java实现并发编程的。第3章介绍深入介绍了Java的内存模型。Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,本章试图揭开Java内存模型的神秘面纱。第4章从介绍多线程技术带来的好处开始,讲述了如何启动和终止线程以及线程的状态,详细阐述了多线程之间进行通信的基本方式和等待/通知经典范式。第5章介绍Java并发包中与锁相关的API和组件,以及这些API和组件的使用方式与实现细节。第6章介绍了Java中的大部分并发容器,并深入剖析其实现原理,让读者领略大师的设计技巧。第7章介绍了Java中的原子操作类,并给出一些实例。第8章介绍了Java中提供的并发工具类,这是并发编程中的瑞士军刀。第9章介绍了Java中的线程池实现原理和使用建议。第10章介绍了Executor框架的整体结构和成员组件。第11章介绍几个并发编程的实战,以及排查并发编程造成问题的方法。 精彩导读 第1章:并发编程的挑战 并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题,以及受限于硬件和软件的资源限制问题,本章会介绍几种并发编程的挑战以及解决方案。 1.1 上下文切换即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。这就像我们同时读两本书,当我们在读一本英文的技术书时,发现某个单词不认识,于是便打开中英文字典,但是在放下英文技术书之前,大脑必须先记住这本书读到了多少页的第多少行,等查完单词之后,能够继续读这本书。这样的切换是会影响读书效率的,同样上下文切换也会影响多线程的执行速度。 1.1.1 多线程一定快吗下面的代码演示串行和并发执行并累加操作的时间,请分析:下面的代码并发执行一定比串行执行快吗? public class ConcurrencyTest { private static f?inal long count = 10000l; public static void main(String[] args) throws InterruptedException { concurrency(); serial(); } private static void concurrency() throws InterruptedException { long start = System.currentTimeMillis(); Thread thread = new Thread(new Runnable() { @Override public void run() { int a = 0; for (long i = 0; i < count; i++) { a += 5; } } }); thread.start(); int b = 0; for (long i = 0; i < count; i++) { b--; } long time = System.currentTimeMillis() - start; thread.join(); System.out.println("concurrency :" + time+"ms,b="+b); } private static void serial() { long start = System.currentTimeMillis(); int a = 0; for (long i = 0; i < count; i++) { a += 5; } int b = 0; for (long i = 0; i < count; i++) { b--; } long time = System.currentTimeMillis() - start; System.out.println("serial:" + time+"ms,b="+b+",a="+a); } } 上述问题的答案是“不一定”,测试结果如表1-1所示。 表1-1 测试结果 循环次数 串行执行耗时/ms 并发执行耗时 并发比串行快多少 1亿 130 77 约1倍 1千万 18 9 约1倍 1百万 5 5 差不多 10万 4 3 慢 1万 0 1 慢 从表1-1可以发现,当并发执行累加操作不超过百万次时,速度会比串行执行累加操作要慢。那么,为什么并发执行的速度会比串行慢呢?这是因为线程有创建和上下文切换的开销。 1.1.2 测试上下文切换次数和时长下面我们来看看有什么工具可以度量上下文切换带来的消耗。使用Lmbench3可以测量上下文切换的时长。使用vmstat可以测量上下文切换的次数。下面是利用vmstat测量上下文切换次数的示例。$ vmstat 1 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 127876 398928 2297092 0 0 0 4 2 2 0 0 99 0 0 0 0 0 127868 398928 2297092 0 0 0 0 595 1171 0 1 99 0 0 0 0 0 127868 398928 2297092 0 0 0 0 590 1180 1 0 100 0 0 0 0 0 127868 398928 2297092 0 0 0 0 567 1135 0 1 99 0 0CS(Content Switch)表示上下文切换的次数,从上面的测试结果中我们可以看到,上下文每1秒切换1000多次。 1.1.3 如何减少上下文切换减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。无锁并发编程。多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。CAS算法。Java的Atomic包使用CAS算法来更新数据,而不需要加锁。使用最少线程。避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。 1.1.4 减少上下文切换实战本节将通过减少线上大量WAITING的线程,来减少上下文切换次数。 第一步:用jstack命令dump线程信息,看看pid为3117的进程里的线程都在做什么。sudo -u admin /opt/ifeve/java/bin/jstack 31177 > /home/tengfei.fangtf/dump17 第二步:统计所有线程分别处于什么状态,发现300多个线程处于WAITING(onobject-monitor)状态。[tengfei.fangtf@ifeve ~]$ grep java.lang.Thread.State dump17 | awk '{print $2$3$4$5}' | sort | uniq -c 39 RUNNABLE 21 TIMED_WAITING(onobjectmonitor) 6 TIMED_WAITING(parking) 51 TIMED_WAITING(sleeping) 305 WAITING(onobjectmonitor) 3 WAITING(parking) 第三步:打开dump文件查看处于WAITING(onobjectmonitor)的线程在做什么。发现这些线程基本全是JBOSS的工作线程,在await。说明JBOSS线程池里线程接收到的任务太少,大量线程都闲着。"http-0.0.0.0-7001-97" daemon prio=10 tid=0x000000004f6a8000 nid=0x555e in Object.wait() [0x0000000052423000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) waiting on <0x00000007969b2280> (a org.apache.tomcat.util.net.AprEndpoint$Worker) java.lang.Object.wait(Object.java:485) at org.apache.tomcat.util.net.AprEndpoint$Worker.await(AprEndpoint.java:1464) locked <0x00000007969b2280> (a org.apache.tomcat.util.net.AprEndpoint$Worker) org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1489) at java.lang.Thread.run(Thread.java:662) 第四步:减少JBOSS的工作线程数,找到JBOSS的线程池配置信息,将maxThreads降到100。 emptySessionPath="false" minSpareThreads="40" maxSpareThreads="75" maxPostSize="512000" protocol="HTTP/1.1" enableLookups="false" redirectPort="8443" acceptCount="200" bufferSize="16384" connectionTimeout="15000" disableUploadTimeout="false" useBodyEncodingForURI= "true"> 第五步:重启JBOSS,再dump线程信息,然后统计WAITING(onobjectmonitor)的线程,发现减少了175个。WAITING的线程少了,系统上下文切换的次数就会少,因为每一次从WAITTING到RUNNABLE都会进行一次上下文的切换。读者也可以使用vmstat命令测试一下。[tengfei.fangtf@ifeve ~]$ grep java.lang.Thread.State dump17 | awk '{print $2$3$4$5}' | sort | uniq -c 44 RUNNABLE 22 TIMED_WAITING(onobjectmonitor) 9 TIMED_WAITING(parking) 36 TIMED_WAITING(sleeping) 130 WAITING(onobjectmonitor)1 WAITING(parking) 1.2 死锁锁是个非常有用的工具,运用场景非常多,因为它使用起来非常简单,而且易于理解。但同时它也会带来一些困扰,那就是可能会引起死锁,一旦产生死锁,就会造成系统功能不可用。让我们先来看一段代码,这段代码会引起死锁,使线程t1和线程t2互相等待对方释放锁。 public class DeadLockDemo { privat static String A = "A"; private static String B = "B"; public static void main(String[] args) { new DeadLockDemo().deadLock(); } private void deadLock() { Thread t1 = new Thread(new Runnable() { @Override publicvoid run() { synchronized (A) { try { Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (B) { System.out.println("1"); } } } }); Thread t2 = new Thread(new Runnable() { @Override publicvoid run() { synchronized (B) { synchronized (A) { System.out.println("2"); } } } }); t1.start(); t2.start(); } } 这段代码只是演示死锁的场景,在现实中你可能不会写出这样的代码。但是,在一些更为复杂的场景中,你可能会遇到这样的问题,比如t1拿到锁之后,因为一些异常情况没有释放锁(死循环)。又或者是t1拿到一个数据库锁,释放锁的时候抛出了异常,没释放掉。一旦出现死锁,业务是可感知的,因为不能继续提供服务了,那么只能通过dump线程查看到底是哪个线程出现了问题,以下线程信息告诉我们是DeadLockDemo类的第42行和第31行引起的死锁。 "Thread-2" prio=5 tid=7fc0458d1000 nid=0x116c1c000 waiting for monitor entry [116c1b000] java.lang.Thread.State: BLOCKED (on object monitor) at com.ifeve.book.forkjoin.DeadLockDemo$2.run(DeadLockDemo.java:42) - waiting to lock <7fb2f3ec0> (a java.lang.String) - locked <7fb2f3ef8> (a java.lang.String) at java.lang.Thread.run(Thread.java:695) "Thread-1" prio=5 tid=7fc0430f6800 nid=0x116b19000 waiting for monitor entry [116b18000] java.lang.Thread.State: BLOCKED (on object monitor) at com.ifeve.book.forkjoin.DeadLockDemo$1.run(DeadLockDemo.java:31) - waiting to lock <7fb2f3ef8> (a java.lang.String) - locked <7fb2f3ec0> (a java.lang.String) at java.lang.Thread.run(Thread.java:695) 现在我们介绍避免死锁的几个常见方法。避免一个线程同时获取多个锁。避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。 1.3 资源限制的挑战(1)什么是资源限制资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。例如,服务器的带宽只有2Mb/s,某个资源的下载速度是1Mb/s每秒,系统启动10个线程下载资源,下载速度不会变成10Mb/s,所以在进行并发编程时,要考虑这些资源的限制。硬件资源限制有带宽的上传/下载速度、硬盘读写速度和CPU的处理速度。软件资源限制有数据库的连接数和socket连接数等。 (2)资源限制引发的问题在并发编程中,将代码执行速度加快的原则是将代码中串行执行的部分变成并发执行,但是如果将某段串行的代码并发执行,因为受限于资源,仍然在串行执行,这时候程序不仅不会加快执行,反而会更慢,因为增加了上下文切换和资源调度的时间。例如,之前看到一段程序使用多线程在办公网并发地下载和处理数据时,导致CPU利用率达到100%,几个小时都不能运行完成任务,后来修改成单线程,一个小时就执行完成了。 (3)如何解决资源限制的问题对于硬件资源限制,可以考虑使用集群并行执行程序。既然单机的资源有限制,那么就让程序在多机上运行。比如使用ODPS、Hadoop或者自己搭建服务器集群,不同的机器处理不同的数据。可以通过“数据ID%机器数”,计算得到一个机器编号,然后由对应编号的机器处理这笔数据。对于软件资源限制,可以考虑使用资源池将资源复用。比如使用连接池将数据库和Socket连接复用,或者在调用对方webservice接口获取数据时,只建立一个连接。 (4)在资源限制情况下进行并发编程如何在资源限制的情况下,让程序执行得更快呢?方法就是,根据不同的资源限制调整程序的并发度,比如下载文件程序依赖于两个资源——带宽和硬盘读写速度。有数据库操作时,涉及数据库连接数,如果SQL语句执行非常快,而线程的数量比数据库连接数大很多,则某些线程会被阻塞,等待数据库连接。 1.4 本章小结本章介绍了在进行并发编程时,大家可能会遇到的几个挑战,并给出了一些解决建议。有的并发程序写得不严谨,在并发下如果出现问题,定位起来会比较耗时和棘手。所以,对于Java开发工程师而言,笔者强烈建议多使用JDK并发包提供的并发容器和工具类来解决并发问题,因为这些类都已经通过了充分的测试和优化,均可解决了本章提到的几个挑战。
Kubernetes 项目作为容器编排领域的事实标准, 成功推动了诸如阿里云 Kubernetes (ACK)等云原生服务的迅速增长。但同时我们也关注到,Kubernetes 的核心 API 资源比如 Service、Deployment 等,实际上只是应用中的不同组成部分,并不能代表一个应用的全部。也许我们可以通过像 Helm charts 这样的方式来尝试表达一个可部署的应用,可一旦部署起来,实际运行的应用中却依旧缺乏以应用为中心的约束模型。这些问题都反映出,Kubernetes 以及云原生技术栈需要一种以应用为中心的 API 资源来提供一个专注于应用管理的、标准的、高度一致的模型,这个 API 资源可以代表完整运行的应用本身,而不仅仅是应用模板或者一个应用的几个组成部分,这就是今天阿里云与微软联合宣布推出开放应用模型 Open Application Model (OAM)的原因。 项目地址:https://openappmodel.io,OAM 项目目前由规范和实现两部分组成 什么是 Open Application Model? OAM 是一个专注于描述应用的标准规范。有了这个规范,应用描述就可以彻底与基础设施部署和管理应用的细节分开。这种关注点分离(Seperation of Conerns)的设计好处是非常明显的。 举个例子,在实际生产环境中,无论是 Ingress , CNI,还是 Service Mesh,这些表面看起来一致的运维概念,在不同的 Kubernetes 集群中可谓千差万别。 通过将应用定义与集群的运维能力分离,我们就可以让应用开发者更专注于应用本身的价值点,而不是”应用部署在哪“这样的运维细节。 此外,关注点的分离让平台架构师可以轻松地把平台的运维能力封装成可被复用的组件,从而让应用开发者能够专注于将这些运维组件与代码进行集成,从而快速、轻松地构建可信赖的应用。 Open Application Model 的目标是让简单的应用管理变得更加轻松,让复杂的应用交付变得更加可控。 一、应用组件(Components) 在 OAM 中,“应用”是由多个概念共同组合而成的。 第一个概念是:应用组件(Components),它是整个应用的重要组成部分。 所以说,应用组件既可以包括应用运行所依赖的服务:比如 MySQL 数据库,也包括应用服务本身:比如拥有多个副本的 PHP 服务器。 开发者可以把他们写的代码”打包“成一个应用组件,然后编写配置文件来描述该组件与其他服务之间的关系。 应用组件的概念,让平台架构师能够将应用分解成一个个可被复用的模块,这种模块化封装应用组成部分的思想,代表了一种构建安全、高可扩展性应用的最佳实践:它通过一个完全分布式的架构模型,实现了应用组件描述和实现的解耦。 二、应用部署配置文件(Application Configuration) 而为了将这些应用组件描述变成一个真正运行起来的应用,应用运维人员会通过一个专门的、包含了所有应用组件信息的部署配置文件来实例化这个待运行的应用。 这个配置文件本身也是 OAM 规范中的一个声明式 API,用来让应用运维人员能够根据开发者或者平台提交的应用描述,实例化出对应的、真正运行起来的应用。 三、应用运维特征(Traits) 最后一个概念是一组应用运维特征(Traits) ,它们描述了应用在具体部署环境中的运维特征,比如应用的水平扩展的策略和 Ingress 规则,这些特征对于应用的运维来说非常重要,但它们在不同的部署环境里却往往有着截然不同的实现方式。 举一个简单例子,同样是 Ingress,它在公有云上和本地数据中心的实现可能是完全不同的:前者一般是 SLB 这样的云服务,而后者则可能是一个专门的硬件。这也就意味着针对这两个环境的 Ingress 运维工作,将会有天壤之别。 但与此同时,无论是在哪个环境里,这个 Ingress 规则对于应用开发人员来说,可能是完全相同的。 应用特征的设计,让这种关注点分离成为可能:只要这两个环境在 OAM 模型下提供了对 Ingress 这个应用运维特征的实现,那么你的应用就可以使用统一的 Ingress 规则描述无差别的在这两个地方运行起来。而与此同时,这两个环境的基础设施供应商可以继续通过配置这些应用特征的实现,来满足它们各自的运维要求(例如:不同环境里 Ingress 实现在满足合规性和安全性上的差异) OAM:平台无关、高可扩展的应用描述能力 与 PaaS 应用模型相比,OAM 有很多独有的特点,其中最重要一点是:平台无关性。虽然我们目前发布的 OAM 实现(rudr)是基于 Kubernetes 的,但 Open Application Model 与 Kubernetes 并没有强耦合。实际上 ,OAM 可以实现到任意平台或运行环境之上,这当然也包括边缘计算与物联网的场景。我们也认同Kubernetes 在很多运行环境中可能并不是最好的选择,或者是像 Serverless 这类用户并不需要关心基础设施复杂性的运行环境。在这些场景下,OAM 都可以提供完全一致的应用管理体验。 第二个重要的特点是,OAM 的 specification (OAM 规范) 在设计上天然是可扩展的。OAM 不像 PaaS 那样自成封闭体系,也不会通过某种独有的应用管理环境来屏蔽掉底层平台的特点(比如:在 Kubernetes 之上”盖一个大帽子“)。 相反,OAM 使平台层可以通过应用特征系统 (Trait system)来体现平台的特性和差异性。也就是说,只要不同的平台都能够提供应用所需要的某些应用特征 (Trait),开发人员就能轻松地研发跨平台的应用。类似地,哪怕最底层的硬件提供商,也可以通过应用特征系统来体现其平台特性。 OAM 的整体设计,就是为了避免在平台可移植性中经常发生的“最小公分母”锁定问题。相反,OAM 不但提供了可移植性的能力,它还确保了每个平台有能力去透出独有的特性和用途。 OAM 让开发人员可以自由地针对不同平台以标准方式在可移植性和差异化功能之间取得平衡。 开放的社区与未来 如今,开放应用模型以及相应的 Kubernetes 实现有了初步的成果,我们感到非常兴奋。 OAM 规范是基于 Open Web Foundation 协议进行开发的。我们的目标,从一开始就是让开放应用模型 Open Application Model 成为中立基金会的项目,以便实现开放治理与广泛合作。如果您想了解更多信息,请前往开放应用模型项目的GitHub 仓库: OAM specification ,以及 基于 Kubernetes 的 OAM 标准实现 Rudr 。 今天 OAM 项目的发布只是迈出的一小步。我们非常期待得到您的反馈,并与大家密切协作,针对 Kubernetes 和任意云环境打造一个简单、可移植、可复用的应用模型。 点击阅读原文直达OAM主页:https://openappmodel.io
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 超全云栖演讲稿实录资料(持续更新ing),错过再等一年! 2019年9月25日-27日,杭州云栖大会圆满举办。大会包含130+场峰会和专场、上千位重量级分享嘉宾以及硬核科技大型展区。开发者社区搜集全站云栖资料与大咖演讲实录,为你带来一年仅此一次的丰富云栖干货! 最强干货 隐私与AI兼得,蚂蚁金服是如何做到的? 在人工智能时代,数据是AI领域的石油,如果没有数据很难将AI更好的落地。但是数据孤岛阻碍了数据的获取和利用,蚂蚁金服在三年前开始布局隐私保护机器学习,致力于在保护数据安全和隐私保护的前提下进行机器学习,我们称之为共享智能。 这6种编码方法,你掌握了几个? Don Roberts 提出的一条重构准则:第一次做某件事时只管去做;第二次做类似的事时会产生反感,但无论如何还是可以去做;第三次再做类似的事时,你就应该重构。 编码也是如此,当多次编写类似的代码时,我们需要考虑是否有一种方法能够提高编码速度,让编码速度“起飞”?高德地图技术专家陈昌毅(常意)多年来致力于敏捷开发,总结了一套编码的方法论,有助于程序员"快速、优质、高效"地进行编码。 为什么 K8s 集群达万级规模,阿里购物体验还能如丝顺滑? 本文主要介绍阿里巴巴和蚂蚁金服在大规模生产环境中落地 Kubernetes 的过程中,在集群规模上遇到的典型问题以及对应的解决方案,内容包含对 etcd、kube-apiserver、kube-controller 的若干性能及稳定性增强,这些关键的增强是阿里巴巴和蚂蚁金服内部上万节点的 Kubernetes 集群能够平稳支撑 2019 年天猫 618 大促的关键所在。文内藏福利,往里看,免费课程立刻领取~ 每天读本书 《EOS区块链应用开发指南》| 每日读本书 1.业内专家汪波、何琼、孤失、翟东明联袂力荐 2.本书将向读者展示EOS区块链技术的众多概念和特性,包括初识EOS、EOS的工作原理、开发工具和环境、编写智能合约、EOS RPC接口、创建和部署DApp、部署基于EOS的侧链等内容。 3.本书结合实战经验,从基础的概念和原理,到一线的执行与案例,对EOS技术进行了系统且深入的阐述。 每日集成开发者社区精品内容,请持续关注开发者必读。
编辑推荐 1.业内专家汪波、何琼、孤失、翟东明联袂力荐 2.本书将向读者展示EOS区块链技术的众多概念和特性,包括初识EOS、EOS的工作原理、开发工具和环境、编写智能合约、EOS RPC接口、创建和部署DApp、部署基于EOS的侧链等内容。 3.本书结合实战经验,从基础的概念和原理,到一线的执行与案例,对EOS技术进行了系统且深入的阐述。 虞家男 编著 内容提要 EOS被称为区块链3.0,是下一代区块链技术,《EOS区块链应用开发指南》将向读者展示EOS区块链技术的众多概念和特性。《EOS区块链应用开发指南》共分为7章,分别是初识EOS、EOS的工作原理、开发工具和环境、编写智能合约、EOS RPC接口、创建和部署DApp、部署基于EOS的侧链等。 《EOS区块链应用开发指南》希望能够帮助开发者进入EOS的世界并比较容易地上手开发DApp。 精彩导读 前言 科技界的发展规律遵循“天下大势,分久必合,合久必分”,区块链世界的发展也许正得益于“分”这个大势。从中心化的传统信息系统世界逐渐过渡到去中心化的区块链新世界,我们正有幸经历着一场从“合”到“分”的生产关系伟大变革。在这个过程中,区块链也在现有如PoW、PoS 这些完全去中心化的共识方式的基础上,开始了一些从“分”到“合”的有益探索,就像EOS 的DPoS+BFT 这种去中心化与中心化相结合的共识模式一样。 在分分合合的大势下,EOS 主网正式上线。经历了比特币、以太坊两代区块链的发展,EOS 被称为区块链3.0。 对开发者来说,应该怎样学习并进入EOS 的世界?如何使用EOS 开发DApp?本书希望能够在这些问题上给还未进入区块链世界的开发者们提供一些帮助。
2019年9月25日-27日,杭州云栖大会圆满举办。大会包含130+场峰会和专场、上千位重量级分享嘉宾以及硬核科技大型展区。开发者社区搜集全站云栖资料与大咖演讲实录,为你带来一年仅此一次的丰富云栖干货! 反手先甩给你一份:2019云栖大会精品资料下载! 每一年杭州云栖云栖大会结束后,都有无数开发者希望获取资料进行学习。这里面可有近 80份 PDF资料供大家下载学习哦! 只有PDF显然是不能满足大家的求知热情的,下面将分专场为大家带来部分大咖更为细致的演讲内容,动动手指,如临现场! 大咖有约专场: “飞天”如何有效支撑中国最大公共云:详情架构与演进Go Git:面向未来的代码平台图像搜索与识别背后的故事计算机视觉在智联网汽车领域的应用开放平台能为开发者带来什么价值?路径规划技术演进之路 开发者峰会: 云上视觉智能的挑战与实践金融数据智能在蚂蚁金服的现状与发展阿里巴巴的云原生与开发者 云原生数据库POLARDB专场: 云原生数据库POLARDB专场“硬核”解析 下一代云数据库分析专场: 打造“云边一体化”,时序时空数据库TSDB技术原理深度解密 分布式数据库专场: “顶级玩家”集结!分布式数据库专场精华解读 容器专场: 规模、性能、弹性全面升级,让天下没有难用的 K8s安全容器的发展与思考 全面上云专场: 关于容器迁移、运维、查错与监控,你想知道的都在这里了 企业数字化转型专场: 应用上云新模式,Aliware 全家桶亮相杭州云栖大会 阿里云系统软件开发者专场: Alibaba Cloud Linux 2-阿里云Linux操作系统全面解析袋鼠:云原生底层系统探索和实践 数智化办公生态专场: 企业音视频会议的挑战和机遇 移动端侧技术专场: 淘宝端智能演进和思考Flutter 原理与闲鱼深度实践 搜索推荐工程技术专场: 企查查搜索引擎演进之路 下一代云存储技术与最佳实践专场: 对象存储海量数据管理和应用最佳实践 高德技术专场: 视觉智能在高德地图的应用 开源数据专场: 开源界大咖集体现身,开源数据库专场重点再回眸! NoSQL 数据库专场: 行业顶级NoSQL成员坐阵,NoSQL数据库专场重点解析! SaaS加速器专场: 阿里云郑刚:SaaS上云工具包为企业应用构筑上云之梯阿里云高磊:API网关加速能力聚合与生态集成阿里云资深技术专家黄省江:让天下没有难做的SaaS宜搭PLUS发布:SaaS加速器面向ISV的技术红利携手阿里云构建区域软件生态阿里云朱以军:阿里云心选——面向渠道商的商业红利云粒智慧+宜搭Plus,搭建企业级智能费控平台宜搭PLUS发布:SaaS加速器面向ISV的技术红利阿里云李立峰:阿里云RPA——领回您的机器人员工江苏鑫合易家:阿里云RPA助力南京银行开户提效75%以上 企业级数据库最佳实践专场: 破解企业数据库“疑难杂症”,最佳实践专场划重点了! 金融智能专场: 金融行业怎么用AI?蚂蚁金服是这么做的 更多云栖大会演讲整理与稿件下载持续火热更新中,关注 开发者学习资源库 ,获取一手云栖资料!
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 云服务OpenAPI的7大挑战,架构师如何应对? API 是模块或者子系统之间交互的接口定义。好的系统架构离不开好的 API 设计,而一个设计不够完善的 API 则注定会导致系统的后续发展和维护非常困难。比较好的API设计样板可以参考 github 和 k8s ,它们都是典型的RESTful接口。云服务对外开放的窗口就是OpenAPI,今天要讨论的话题是“云服务场景下OpenAPI设计的挑战”。 最强干货 干货|Flutter 原理与闲鱼深度实践 本文整理自云栖大会移动技术专场。王康(正物)—— 阿里巴巴技术专家,之前主要负责 Flutter 在闲鱼中的混合开发体系,目前重点关注 Flutter 深入度以及生态相关的工作。本文将分享三方面内容, Flutter 的原理、 Flutter 在闲鱼中的应用,最后介绍我们在深度方面的一些探索。 详解阿里云数据中台,一篇文章全面了解大数据“网红” 阿里巴巴数据中台是阿里云上实现数据智能的最佳实践,它是由数据中台方法论+组织+工具所组成,数据中台方法论采用实现企业数据的全局规划设计,通过前期的设计形成统一的数据标准、计算口径,统一保障数据质量,面向数据分析场景构建数据模型,让通用计算和数据能沉淀并能复用,提升计算效能。 从零开始入门 K8s | 可观测性:监控与日志 监控和日志是大型分布式系统的重要基础设施,监控可以帮助开发者查看系统的运行状态,而日志可以协助问题的排查和诊断。 在 Kubernetes 中,监控和日志属于生态的一部分,它并不是核心组件,因此大部分的能力依赖上层的云厂商的适配。Kubernetes 定义了介入的接口标准和规范,任何符合接口标准的组件都可以快速集成。 每天读本书 《Elasticsearch源码解析与优化实战》| 每日读本书 Elasticsearch 是一个开源的全文搜索引擎,很多用户对于大规模集群应用时遇到的各种问题难以分析处理,或者知其然而不知其所以然。本书分析 Elasticsearch 中重要模块及其实现原理和机制,让用户深入理解相关重要配置项意义,应对系统故障时不再迷茫。另外,本书提供实际应用场景中一些常见问题的优化建议,这些建议都是作者经过大规模测试及应用验证过的。 精品公开课 信息收集和漏洞扫描技术 如何成为网络安全工程师?不知道该如何入门?本课程通过四个模块的知识学习,让您能够对网络安全相关基础技术有一个全面的了解和掌握,主要内容包括:IT基础技术、网络安全基础概念、网络安全渗透技术基础及Web应用安全基础。主要的学习方式包括在线直播、图文和在线实验进行学习。如果您是一位对网络安全感兴趣的大学生,我们还会根据您学习过程的参与情况,与线下考试情况,给您推荐实习或就业机会,快快来参与吧。 每日集成开发者社区精品内容,请持续关注开发者必读。
编辑推荐 Elasticsearch 是一个开源的全文搜索引擎,很多用户对于大规模集群应用时遇到的各种问题难以分析处理,或者知其然而不知其所以然。本书分析 Elasticsearch 中重要模块及其实现原理和机制,让用户深入理解相关重要配置项意义,应对系统故障时不再迷茫。另外,本书提供实际应用场景中一些常见问题的优化建议,这些建议都是作者经过大规模测试及应用验证过的。 张超 著 内容提要 《Elasticsearch源码解析与优化实战》介绍了Elasticsearch的系统原理,旨在帮助读者了解其内部原理、设计思想,以及在生产环境中如何正确地部署、优化系统。系统原理分两方面介绍,一方面详细介绍主要流程,例如启动流程、选主流程、恢复流程;另一方面介绍各重要模块的实现,以及模块之间的关系,例如gateway模块、allocation模块等。本书的最后一部分介绍如何优化写入速度、搜索速度等大家关心的实际问题,并提供了一些诊断问题的方法和工具供读者参考。 《Elasticsearch源码解析与优化实战》适合对Elasticsearch进行改进的研发人员、平台运维人员,对分布式搜索感兴趣的朋友,以及在使用Elasticsearch过程中遇到问题的人们。 精彩导读 前言 我们可以在不关心原理的情况下使用Elasticsearch(以下简称ES),但要想用好ES,就必须熟知其内部原理。 为什么要阅读代码?在传统软件行业,技术文档非常丰富。当开展一个项目时,从需求分析,到概要设计、详细设计,每个步骤都有相应的文档,从项目的整体架构、技术方案选型,到流程图、类图,细化到每个接口及参数。在这种情况下,想要搞清楚系统原理,并不需要阅读代码,文档上什么都有。但是互联网产品迭代快,技术文档不全,想要搞清楚原理,只能阅读代码,相当于从代码中逆向理解设计思想。 通过分析源码,我们可以有以下收获:理解设计思想 当我们面临要解决的问题或实现的目标时,往往有多种方案可以选择。无论表面上看起来多么简单的架构,其背后都经过了深思熟虑。思考一下为什么使用现在的方案?有没有更好的解决方案?探究内部机制的原理 某个技术点是怎么实现的?搞明白执行流程 某个过程是什么样的,都做了什么?有几步?先做什么,后做什么? 熟悉代码结构 如果需要进行二次开发,则给出代码入口和调用关系,有时候找到某个逻辑的代码实现要花很多时间。 学以致用 借鉴其设计理念,掌握其解决问题的方式和方法,将来面对类似的问题时可以参考。 本书结构本书由四部分组成,第一部分为基础知识和环境准备(第1~2章);第二部分介绍ES的主要流程(第3~10章),包括集群启动流程、节点启动/关闭流程、选主流程、读写流程、搜索流程和索引恢复流程;第三部分主要介绍重要内部模块(第11~17章),包括gateway模块、allocation模块、Snapshot模块、Cluster模块、Transport模块和ThreadPool模块等;第四部分介绍优化和诊断方法(第18~22章),包括写入速度优化、搜索速度优化、磁盘使用量优化,以及在生产环境中的实际应用建议,第22章介绍常用的问题诊断方法,排查集群遇到的问题。
点击这里免费下载《Flutter in action》 您也可以复制链接到浏览器 https://developer.aliyun.com/topic/download?id=789 下载。 闲鱼是国内最早使用Flutter的团队,也是Flutter业务线渗入最深的团队之一。现在承载亿级流量的闲鱼将多年最佳实践经验整理成册,《Flutter in action》 正式面世! √ Google Flutter产品经理强烈推荐 ! √ 超全Flutter企业级实践指南 ! Flutter开源工具大集合 闲鱼Flutter应用框架Fish Redux、开发利器AspectD、FlutterBoost等一众开发工具正式开源,现在《Flutter in action》一次帮你找全了。开源地址+技术解析,手把手教你Flutter应用框架和混合开发原理! 闲鱼Flutter企业级应用实践 随着无线,IoT的发展,5G的到来,移动研发越发向多端化发展。传统的基于Native+Web+服务端的开发方式,研发效率低下,显然已经无法适应发展需要。 而Flutter是Google开源的跨端便携UI工具包,除了具有非常优秀的跨端渲染一致性,还具备非常高效的研发体验,丰富的开箱即用的UI组件,以及跟Native媲美的性能体验。由于它的众多优势,也使得Flutter成为了近些年来热门的新技术。 在这本书中将详细讲解闲鱼Flutter&FaaS云端一体化架构,和闲鱼基于Flutter的架构演进与创新,学习一套全面的Flutter架构应用方案。 混合开发实践指南 你将在这里看到闲鱼技术团队利用Flutter技术改造和上线复杂业务的混合工程改造实践、抽取Flutter依赖到远程的实现细节、以及使用Plugin桥接获取设备信息、使用基础网络库等混合开发实践指南。 这些实践遍布闲鱼各大业务线和应用场景,为你使用Flutter打造自己的研发体系探索一条实践之路。 Flutter的深入进阶教程 在获得开源工具与开发实践指南后,你还将在本书中学到Flutter的更多应用场景。 它们包括了如何低成本实现Flutter富文本、设计一个高准确率的Flutter埋点框架、Flutter外接纹理、可定制化的Flutter相册组件等等深入进阶内容。 这可能是一本最全面的Flutter实践开发手册了!
编辑推荐 √ 经典原味,Effective Java 升级版√ Google 首席Java架构师倾情力作√ 涵盖Java 7、Java 8和Java 9中的各种新特性 【美】 Joshua Bloch(约书亚·布洛克)著 内容提要 自从Java 6 发布之后,Java 又有了翻天覆地的变化。《Effective Java(第3版)(英文版)》涵盖了Java 7、Java 8 和Java 9 中语言和库的各种新特性。让你能够深入了解Java 平台的细微之处。通过对每一个项目的全面描述和解释,告诉你应该做什么、不应该做什么,以及为什么要这样做。 作者简介 Joshua BlochJava 集合框架创办人,领导了很多 Java 平台特性的设计和实现,包括 JDK 5.0 语言增强以及屡获殊荣的 Java 集合框架。2004年6月他离开了SUN公司并成为 Google 的首席 Java 架构师。此外他还因为《Effective Java》一书获得著名的 Jolt 大奖。 精彩导读 前言 1997年,Java还年轻时,James Gosling(Java 之父)称它为“蓝领的语言”(blue collar language),以此来表达它“十分简单”[Gosling97]。几乎与此同时,Bjarne Stroustrup(C++之父)将C++称为“多范式语言”(multi-paradigm language),“故意和那些只能用单一方式编写程序的语言区别开来”[Stroustrup95]。Stroustrup警告说: Java相对的简单性——和大多数新语言一样——一部分是因为错觉,另一部分是因为它的不完整性。随着时间的推移,Java的规模和复杂性将显著增长。它的规模将增加两到三倍,相关的扩展和库也会不断增加。 现在,20年过去了,公平来讲,Gosling和Stroustrup都是正确的。Java现在变得复杂且庞大,从并行执行、迭代,到日期和时间表示法都有多个抽象。 虽然我的热情随着平台的发展已经冷却,但我仍然喜欢Java,鉴于其规模和复杂性的增长,我们迫切需要一个最新的最佳实践指南,这就是本书写作的目的。我希望这个版本能够在延续旧版本理念的前提下满足大家新的需求。 小很美,简单却不易。 附言:如果我没有提及最近占据我大量时间去践行的业内最佳实践,那将是我的疏忽。自20世纪50年代这个行业诞生以来,我们可以自由地重新实现彼此的API。这种做法是计算机技术迅速成功的关键。我以实际行动致力于维护这种自由[CompSci17],我希望你能加入进来。保留彼此可以重新实现API的权利,这对于维持行业健康发展至关重要。致谢感谢第1版和第2版的读者用你们的热情来接纳这本书,将它的理念铭记于心,并且让我知道它对你们的工作有那么多积极的影响。感谢众多的讲师在你们的课程中使用这本书,感谢众多的工程师团队采用这本书。感谢Addison-Wesley和Pearson团队在高强度的工作压力下依旧善良、专业、耐心、优雅。在整个过程中,我的编辑Greg Doench一直保持镇定:他是一位好编辑,同时也是一名优雅的绅士。为了这个项目他恐怕生了不少白发,在此我向他道歉。我的项目经理Julie Nahil和我的项目编辑Dana Wilson像我期望的那样勤奋、准时、有条理、友好。我的文字编辑Kim Wimpsett一丝不苟且极有品味。我再次拥有了梦寐以求的审校团队,在此致以我诚挚的谢意。几乎检查了每一章的核心团队包括:Cindy Bloch、Brian Kernighan、Kevin Bourrillion、Joe Bowbeer、William Chargin、Joe Darcy、Brian Goetz、Tim Halloran、Stuart Marks、Tim Peierls,以及Yoshiki Shibata。其他审校包括:Marcus Biel、Dan Bloch、Beth Bottos、Martin Buchholz、Michael Diamond、Charlie Garrod、Tom Hawtin、Doug Lea、Aleksey Shipil?v、Lou Wasserman,以及Peter Weinberger。这些审校人员提出了很多建议,大大提升了本书的品质,也避免了很多尴尬的错误。另外,要专门感谢William Chargin、Doug Lea和Tim Peierls。他们是本书很多理念的“扩音器”。William、Doug和Tim孜孜不倦地为本书付出了他们的时间和智慧。最后,感谢我的妻子Cindy Bloch一直鼓励我写作、阅读了所有的原始文档、编写了索引,并一直帮助我处理这个项目中会出现的各种事情,以及在我写作时包容我。
点击这里回顾9月27日上午开发者峰会精彩内容 蚂蚁金服在过去的十几年中用技术重塑金融服务,主要工作集中在金融级交易支付技术和金融级数据智能技术两个领域。 除了和传统大数据相同的需求之外,金融数据智能还有一些独特的需求: 实时性要求高:实时数据增长非常迅速,在线决策越来越多,数据时效性对业务发展非常重要。 计算场景复杂多样:从简单统计和决策规则发展到复杂图、AI模型以及复杂决策。 数据链路长,全链路研发调试:模型研发横跨18个系统,需要掌握多种研发模式,对研发团队提出了巨大挑战。 计算存储高可用:需要实现跨域容灾,高可靠的计算服务。 数据安全,监管合规,风险防控:严格的数据安全、等级体系,保护用户隐私,遵守监管合规,全面风险的防控。 为了应对金融数据智能的需求,蚂蚁金服的计算技术也经历了漫长的演进和发展过程。针对海量数据,需要使用像MapReduce/RDD这样的批处理计算引擎。时效性要求高,因此也需要做实时计算。数据分析的需求越来越多,于是也实现了交互式分析。同时,计算技术也会面临一些挑战,比如多种计算模式带来了研发效率问题,多套系统带来了多样存储需求,需要花费额外成本,并且还需要不同的容灾要求并保障数据安全,并带来了复杂度上升的问题。 开放计算架构 可能对于工程师们而言,想要解决上述问题最理想的方案就是构建一套统一的系统,但是难点在于系统是什么,如何确定系统的边界以及如何对系统进行抽象。首先,因为计算引擎本身与业务是强相关的,而在现阶段没有一个引擎能够满足蚂蚁金服所有的业务需求,并且业务仍在不停地进行创新,也在不停地提出新的需求。因此,蚂蚁金服希望能够拥有开放的计算架构,能够容纳各种各样的计算引擎。 在开放的计算架构之下,存储也需要统一起来。数据存储可以有各种各样的格式,可以有多个副本和复制,可以针对计算引擎进行各种各样的优化,但是在底层需要使用统一的存储,同时要有统一的全站式安全管控措施。 数据安全管控必须是全站的,金融数据智能体系需要提供全站统一的元数据管理、接入规范、安全等级以及隐私保护体系。只有在统一的数据安全规范之上,才可以将不同计算引擎接入进来。并且,针对每个引擎也需要能够提供不同的安全管控策略。 在开放架构、统一存储和统一数据安全规范的基础之上,蚂蚁金服还希望统一编程模型。蚂蚁现在的做法是统一基于一套标准SQL及扩展让用户直接面对底层数据来写自己的业务逻辑。可以想象为将引擎和存储抽象出来,对业务而言,不需要关注流计算与批计算,而只需要关注需要数据做什么以及数据的时效性即可,其他的部分则由引擎以及存储层自动优化和解决。此外,在统一编程模型中真正实现了面向数据的编程,业务同学面向抽象出来的数据编写业务逻辑,而不需要关注具体细节,这就是数据虚拟化的过程。统一编程模型是蚂蚁金服基于现有的计算模式和经验总结而成的,它能够为用户带来研发体验的巨大提升。 以上的这些就形成了蚂蚁金服所认为的能够支撑未来金融业务持续发展的一整套金融数据智能体系。而如今最为火热的话题就是人工智能技术,蚂蚁也需要考虑如何在金融智能业务中应用人工智能。 人工智能系统的现状基本上就是先有一个数据集,经过数据仓库清洗数据,然后将数据放在模型平台上进行训练并且输出训练好的模型,最终将模型推给线上的服务。在整个流程里面,肯定需要多套系统,并且数据也需要复制多份,这就有可能造成数据安全风险以及存储效率低下的问题。此外,因为模型本身的限制,这一过程很难做到实时,但是实时性在金融系统正在变得越来越重要。对于用户而言,需要做数据仓库,需要掌握机器学习平台,还需要将模型部署上线,整套过程非常复杂和烦琐。而蚂蚁金服在金融数据智能新体系里面直接插入了机器学习引擎。 蚂蚁金服SQLFlow的初衷是希望用SQL来表征和描述所要做的机器学习内容,使用SQL将数据和机器学习串联起来,可以让机器学习变得像SQL一样简单。用户只需要了解SQL就能够完成机器学习训练以及模型预测。 ElasticDL是蚂蚁金服开源的基于弹性调度的AI引擎,它完全基于开源的TensorFlow,但在TensorFlow的基础之上实现了容错以及弹性调度。同时,ElasticDL与SQLFlow进行了集成,使得用户训练模型更加简单。 金融级图计算 在蚂蚁金服业务中存在一些图计算的典型场景,比如实时反套现、社交分析以及营销圈人等。这些场景在蚂蚁金服的金融数据智能体系下实现起来也是非常简单的,相当于在体系中插入了一个图计算引擎。这样一来,不仅提供了离线和在线的图计算引擎,同时将流计算、批计算打通,实现了混合计算引擎。此外,蚂蚁还希望进一步优化金融数据智能体系,通过SQL + Gremlin这样的标准使得机器学习的过程更加简单。并且在底层还实现了强一致的在线图数据库,能够为用户提供海量的图数据存储服务。 蚂蚁金服的金融数据智能体系的思路就是提供一个开放架构,因此每当出现新的数据引擎和数据模式时,可以很容易地直接引入进来。如果业务存在新的需求,还可以接入深度定制化的引擎。无论接入了什么样的引擎,都可以直接处理海量的金融数据。而在这些计算引擎发展相对成熟的时候,可以在上层进行归纳,对研发效率等进行更进一步的优化。 金融数据融合计算 当完成了上述体系之后,还需要考虑很多业务往往需要面对非常复杂的计算场景。在复杂的金融场景下,需要同时使用多种计算引擎,因此需要融合计算模式,使得计算引擎之间的互通更加高效。因此,蚂蚁金服和伯克利合作打造了Ray融合计算引擎。在融合计算引擎之下,可以用一套研发流程和标准来描述多种多样的计算,底层计算的状态、数据以及中间结果都是共享的,并且用户可以选择任意的一种研发语言同时完成数据处理、机器学习以及图计算等工作。 融合计算Ray是一个开源框架。蚂蚁金服在Ray项目上也作出了很多贡献,也和伯克利大学一起推动Ray社区的发展。Ray可以将用户的简单本地逻辑转换成海量的分布式执行模型。基于Ray框架,蚂蚁实现了几个融合计算场景,如动态图推导,结合了流计算和图计算,能够实现一秒内完成6层迭代查询;金融在线决策,数据生产到分布式查询决策在一秒内完成;在线机器学习,实现数据样本到模型端到端秒级更新及数据推送。 融合计算引擎并不是为了取代前面提到的所有引擎,而是作为一个计算引擎插入到开放计算架构中,用于某些特殊的场景。当对所有计算引擎具有深入的了解之后,就可以在上面进行优化,构建一个SmartSQL层。 未来展望最后分享一下蚂蚁对金融数据智能体系的展望,希望未来的金融数据智能平台的底层存储是统一的,中间的引擎是开放的、可插拔的和可混用的。在最上层,可以进行优化和统一,也可以直接开放给不同引擎,形成Big Data Base体系。既希望金融数据智能平台能够像使用数据库一样简单,也希望其能够成为开放计算架构的大数据平台,不仅能够处理数据,还能够扩展无限可能性。
编辑推荐 √ .NET专家Bill Wanger倾情力作√ More Effective C# 升级版本√ 应用开发者常备书目√ 深度理解C#编程语言 【美】 Bill Wagner(比尔·瓦格纳) 著 内容提要 在《Effective C#(第3版):编写高质量C#代码的50条有效方法(英文版)》中,.NET 专家Bill Wagner 为我们提供了50 条有效的方法,通过这些方法可以利用C#的全部语言功能编写健壮、高效和运行良好的代码。Wagner 利用他杰出的 C#使用经验,解决了从资源管理到多核支持的各种问题,并揭示了如何规避语言和.NET 环境中常见的陷阱。《Effective C#(第3版):编写高质量C#代码的50条有效方法(英文版)》主要写给那些把 C#当作日常开发工具的专业开发者,读者需要事先熟悉 C#语法和语言特性。 作者简介 Bill Wagner世界上最著名的C#开发者之一,是ECMA C#标准委员会的成员。他是Humanitarian Toolbox的主席,连续11年被授予Microsoft Regional Director和.NET MVP荣誉称号,最近他刚刚被委派到.NET基础顾问理事会任职。Wagner曾在各种公司工作过,从初创小公司到大企业都有,他帮助他们推进软件开发进程、培养他们的软件开发团队,目前他就职于Microsoft的.NET核心内容团队。他为对C#语言和.NET内核感兴趣的开发者整理学习材料。Bill拥有美国伊利诺伊大学香槟分校计算机专业理学学士学位。 媒体评论 一名高效率的.NET开发者需要对他所选择的语言有很深的理解。本书通过合理的探讨以一定的洞察力将这种知识传授给读者。无论是C#新手还是资深开发者,都会通过阅读本书而有所收获。 ——Jason Bock,Magenic首席顾问 如果你像我一样,已经掌握了大量的C#语言精华,而且这些已经使你迅速地成为一名专业的开发者,那么现在你拿在手中的很可能是C#指导材料中很棒的一本合集。Bill的这本Effective C#, Third Edition成功地超出了我的预期。 ——Bill Craun,Ambassador Solutions首席顾问 本书对于构建高性能和高扩展性应用的开发者来说是一本常备书目。Bill拥有一种世人少有的令人惊叹的能力,他可以把一个极其复杂的问题拆解为大家可消化的、能理解的一个个小问题。 ——Josh Holmes,Microsoft架构师 精彩导读 前言 与2004年Effective C#第1版刚出版的时候相比,如今的C#社区已经有了很大的变化。现在有更多的开发者在使用C#。大量的C#社区的出现证明了C#已经成为一门专业的编程语言,很多程序员使用其他编程语言时养成了许多根深蒂固的恶习,这种现象在C#当中并没有出现。C#社区吸纳了更多开发者的经验,从刚毕业的学生到拥有数十年经验的专业开发者都在使用C#。C#现在可以在多个平台上运行,也可以用于构建服务端应用、网站、桌面应用以及多平台下的移动端应用程序。 在写作本书时,我同时考虑到了C#语言本身的变化和C#社区的变化。本书并没有过多地讲解语言变化的历史,只是提供了如何使用当前C#语言的建议。在这一版中删掉的内容都是与如今的C#语言以及应用程序不相关的。新增的内容覆盖了语言和框架的新特性,以及C#社区在使用C#构建多版本的软件产品时总结出来的实践经验。看过之前版本的读者会发现,这一版中包含了More Effective C#第1版中的内容(虽然删除了很多章节)。在第3版中,我重新组织了全书,新的版本将会覆盖很多其他的概念。总之,本书的50个小节是帮助专业开发者更高效地使用C#的一组建议。 本书假定的是C# 6.0环境,它并不是对新语言特性的详尽阐述。正如Effective Software Development系列中的其他书一样,它对如何使用这些特性去解决每天可能会遇到的问题给出了实践性的建议。本书特意涵盖了C# 6.0的新特性,这些新的特性给出了更新、更好的方法来编写常用的语法。互联网搜索给出的结果可能依旧是那些陈旧的早期解决方案。书中同样给出了旧的解决方法,通过对比说明通过改进语言可以有更好的解决方法。 积跬步以至千里。每天读本书,为您搜罗最具权威专业书籍,更多图书推荐请关注每日读书。 好知识需要分享,如您有喜欢的书籍想与广大开发者分享,请在文章下方评论留言,我们将为大家推荐您的爱书!
2020年09月
2020年04月
2020年02月
2020年01月
2019年12月
2019年11月
2019年10月
Java有八种基础的数据类型,八种基本数据类型分别是:int、short、float、double、long、boolean、byte、char;它们的封装类分别是:Integer、Short、Float、Double、Long、Boolean、Byte、Character。
获得阿里云ACP级认证流程主要分为四步:
1、购买ACP认证;阿里云大学官网认证考试页面中打开对应要参加的阿里云ACP认证考试,首页即是购买认证产品页面,如下:
2、报名考试;在页面中点击第二步报名考试,即可看到开放的考试城市和时间,可自行选择,然后点击报名,填写对应信息和授权码进行报名,报名页面如下图:
3、现场考试;在指定的时间去到指定的考场参加考试,使用报名考试的用户名登录官网,打开第三步现场考试页面,等待倒计时进入考试,如下图:
4、领取电子证书;考试交卷后页面有提示查询成绩时间,在指定时间查看成绩,考试通过后即可领取证书,如下图:
阿里云ACP专业认证考试报名授权码可通过阿里云官网,管理控制台查看。
如果您在报名的过程中有任何问题,可以发邮件到training@service.aliyun.com咨询。
您好,根据备案要求,提交备案时域名的域名持有者、证件类型(如资料为营业执照,勿选择组织结构代码证或统一社会信用代码)、证件号码需与备案中的信息一致。 如备案过程中提示域名与主体信息不一致,可能是以下原因: 1、域名未完成实名认证或实名认证信息与备案信息不完全一致,请重新进行域名信息修改,审核通过后2个工作日(不含周末及法定节假日)再提交备案。 2、实名认证或域名过户审核通过不满2个工作日(不含周末及法定节假日),请在审核通过后2个工作日(不含周末及法定节假日)后再提交备案。 3、本次填写的备案信息不准确,请检查备案主体信息并重提备案。
影响域名解析不生效的主要原因: - 域名状态异常
域名过期
修改域名DNS服务器
修改过解析记录
原因一:域名状态异常
域名状态异常会直接影响域名解析生效。可以使用whois工具排查域名状态信息,如果域名状态如果显示为“serverHold”、“clientHold”时,域名均无法解析,原因多为未进行实名认证、域名纠纷、或涉及业务违规被管局处罚等。
原因二:域名过期
域名过期,会直接导致域名解析不生效,域名续费后,解析的生效时间取决于TTL的设置,一般10分钟后可以在进行解析生效测试。
原因三:修改过域名DNS服务器
修改域名DNS服务器,一般默认需要48小时的全球同步时间后才能完全生效。在修改修改域名DNS服务器48小时内,需要保证DNS数据在新DNS服务商以及旧的DNS服务商保持一致。如果您在旧DNS服务商删除了DNS解析数据,或者您没有在新DNS服务商中添加DNS数据,均会造成域名解析不生效的情况出现。
原因四:修改过解析记录
如果修改了解析记录,需要等待各地的运营商Localdns的缓存到期,域名解析才会生效。一般修改解析后的生效时间取决于域名的TTL设置。举例:如下图则可以看到本地DNS的TTL缓存到期时间还有596秒,一般596秒后缓存到期即可获取到最新的解析地址。
阿里巴巴DNS检测工具
此查询工具可以检测本地DNS、权威DNS、公共DNS的解析生效情况。使用方法可参考 解析生效测试方法 文档。
(答案来自网络)一般使用 java.math.BigDecimal 类来处理需要高精度的计算
原因: 1.浮点数(double,flot)因为精度问题, 容易出现不精确的计算结果 2.浮点数范围比较小
(本回答来自网络)判断服务器线路是否为cn2线路,我们可以通过路由追踪的方法检测出来。Windows系统使用tracert命令,linux系统使用mtr测试。得到本地到目标ip之间所经过的路由节点,所得结果若有59.43..,就是cn2线路了,反之则没有。其次线路是双向的,除本地到机房的路由追踪外,还要从机房到本地做一次路由追踪,方法一样,判断cn2线路是否为双向的。
您好,域名指向阿里云大陆服务器,需在阿里云提交备案申请至管局审核通过。如您访问页面出现备案阻断(如上图),可根据如下原因进行排查:
可能原因一:域名未备案。或之前通过其他接入商操作备案,现指向阿里云大陆服务器但备案未接入阿里云。
处理办法:请在阿里云提交备案申请,具体按照流程您可以问我“如何备案“。
可能原因二:备案信息有误,被暂时关闭网站访问。
处理办法:请查看主体或网站负责人邮箱,是否有收到备案信息不合格的通知,如有,请尽快按照通知内容修正备案信息至管局审核,否则备案信息有可能被取消接入。
可能原因三:备案申请刚通过管局审核,信息还未同步到阿里云系统。
处理办法:如果通过阿里云提交的备案申请,刚刚通过管局审核,一般需要24小时同步至阿里云,请您耐心等待。
mapper接口和mapper的xml之间怎么来回跳转?
为什么利用多个域名来存储网站资源更有效
在To C端,持续在智能+人的混合模式上逐步升级,并且把传统的服务往更大的泛服务领域扩展,除了传统服务的智能化、还拓展了哪些领域?
怎么创建阿里云物联网平台?
为什么用nodetool ring只能看到一条记录? 即便所有节点输出的日志里可以看出,他们都发现彼此加入到了这个ring。
建议您提交工单
建议您提交工单
建议您提交工单