首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10000篇文章
优秀的个人博客,低调大师

边缘计算将成为未来创新的基础

与企业技术的其他热门新领域一样,边缘计算也是一个广泛的架构型概念,而非一组特定的解决方案。首先,边缘计算通常应用于低延迟的情况,计算能力必须接近于操作的所在位置,无论该活动是工业物联网机器人投掷小部件,还是传感器在生产过程中对疫苗温度的持续获取。研究公司Frost & Sullivan预测,到2022年,90%的工业企业都将使用边缘计算。 边缘计算是分布式计算的一种形式,它超越了数据中心的范畴。当你想到这一点时,企业应该如何投资于未来呢?是的,我们知道其中的一大部分投资将流向大型的公共云提供商,但企业所拥有和运营的硬件和软件也不会消失。那么,为什么不把它实际地分布到企业最需要它的地方呢? 利用现代服务器的强大功能,在制造、医疗保健或物流运营所在地增强公司业务的运营系统,将可以带来各种各样的业务价值。一般情况下,边缘计算节点会从仪器化的操作系统中收集大量数据,对其进行处理,然后只将结果发送给数据中心,这大大降低了数据传输成本。在这些结果中包含了流程改进、供应链优化、预测分析等方面的机会。 边缘计算的许多面向 边缘计算可能是一个相对较新的领域,但它已经产生了变革性的影响。在“4个基本的边缘计算用例”中,Network World的Ann Bednarz介绍了4个例子,强调了边缘计算的直接、实际的好处,他首先是从一项古老的活动-货运列车检查-开始的。通过数码相机和现场图像处理实现的自动化,不仅大大减少了检查时间和成本,而且还通过更快地发现问题,提高了安全性。Bednarz接着指出了边缘计算在酒店、零售业和采矿业的优势。 CIO的特约编辑Stacy Collett将她的目光集中在了IT和OT(操作技术)之间的鸿沟上,后者关注的是核心的、特定行业的系统--以及该如何更好地弥合这一鸿沟。她的文章“边缘计算领域之争”阐明了可以如何改善IT和OT之间的沟通,并在某些情况下形成混合IT/OT小组,消除冗余并激发创造性的新举措。 OT方面的一个常见反对意见是物联网和边缘计算将使工业系统面临前所未有的恶意攻击风险。CSO特约作家Bob Violino在“确保优势的5个最佳实践”中提到了这个问题。一个关键的建议是实现零信任的安全性,它要求持久的身份验证和微观分割,这样就可以对组织内某个部分的成功攻击进行隔离,而不会扩散到其他的关键系统。 Computerworld的特约作家Keith Shaw则检视了5G在“边缘计算和5G推动商业应用”中的作用。5G最大的卖点之一就是它的低延迟,这对连接物联网设备来说会很有用。但正如IDC的研究总监Dave McCarthy在文章中所解释的那样,当你连接到一个遥远的数据中心时,其减少的延迟就不一定能帮助到你。但另一方面,如果你是在5G网络中部署了“边缘计算,它就可以最大限度地缩短物理距离,大大提高响应时间,”他说。 如果你想知道的话,那些超大规模的云提供商也并没有对这种边缘化的东西置之不理。在“亚马逊、谷歌和微软将他们的云带到边缘”一书中,InfoWorld特约编辑Isaac Sacolick深入研究了三大巨头目前所提供的早期边缘计算产品,包括部署在不同地区的迷你云,以及它们现有的on-prem产品(如AWS Outposts或Azure Stack),这些产品是完全由提供商在进行管理的。Sacolick写道:“公共云下的边缘计算所能提供的唯一好处就是扩展底层云架构和服务的能力。” 各种各样的边缘计算产品和用例涵盖了如此广泛的范围,听起来就像是在进行着复杂的计算。正如许多人所指出的,“大云”模型让人想起了旧的大型机时代,那时客户会通过终端而不是浏览器来接入集中式的计算和存储。边缘计算也让人们认识到,不是所有的东西都可以或应该被集中的。而这种简单概念的创造性变化正在塑造下一代计算技术的过程中发挥出关键性的作用。 【责任编辑: 赵宁宁 TEL:(010)68476606】

优秀的个人博客,低调大师

微隔离——零信任网络的基础构件

零信任是什么、不是什么 零信任作为一种安全管理哲学,近年来渐渐有了一统江山之势,包括“产学研用管”在内的整个安全业界基本上在零信任这个问题上达成了共识,不信大家可以看看等级保护2.0的原文,你就会发现,那里处处体现着零信任思想的光芒。 关于零信任究竟是什么,网上的资料已经很多了,在这里我就不再照搬照抄了。不过我们也注意到,“零信任”这个词除了是一个技术词汇之外也是一个市场词汇,被各个安全公司从自己的视角各自解读,在这个过程中不可避免地会夹带一些私货,从而造成一些混乱和误解,所以我们今天来谈谈零信任不是什么,也许对于帮助大家更好地理解零信任会起到一些积极的作用。 首先,零信任是一个方法论,它定义了一种安全管理的新的视角。它不是一个产品或者说一个技术。也就是说您买不到一个叫零信任的产品,您只能买到帮您实现零信任的某种要求的产品。 其次,零信任是一个过程,或者说是一个方向。它不是一个静态的标准,或者说状态。也就是说,你不能说我们今天来做一个零信任的项目,做过之后我们就拥有了零信任,没有这种事情。你只能说通过一期项目,我们在一定的范围内,在一定的水平上,实现了零信任的某些能力。比如说,我们可以说我们能够在网络层面实现数据中心流量的全面可视和可控,但是网络层之上还有应用层,你看到了网络层面的主体和通信关系,但是你还没有理解应用层面的服务主体和应用访问关系。而在应用层之上还有更深层次的业务层面的分析与控制问题。所以说,零信任的建设应该是一个持续的,逐渐深入,逐渐优化的过程,也是一个在安全与业务之间的一个平衡的过程。 第三,零信任是个广泛适用的方法论,也就是说它可以应用于整个计算架构的各个方面,在每一个细分的环境,每一个具体维度上都可以利用零信任的方式来做管理,而不是说零信任只能像Google那样将之应用于办公网,面向员工的身份进行管理。我们可以看一下Forrester的这张图: 大家可以看到,零信任可以作用于人,设备,网络,工作负载等所有有数据流动的主体上。事实上,相较于办公网而言,数据中心是更容易实现零信任的场景,也是有着更多核心业务和关键数据的地方,因此可以成为我们开展零信任建设的起点。 微隔离在零信任网络中的地位和价值 现在我们说下微隔离技术。前面我们谈到,相较于办公网而言,数据中心网络更适合成为零信任建设的起点。那么对于数据中心网络而言,具体的产品技术是什么呢?这个在业界是有共识的,有两个技术是当下能够落地的,一个是SDP,一个就是微隔离。事实上微隔离技术是最早的一种对零信任这个概念的具体技术实现。我们看下Forrester2019年Q4的报告: 报告中的这段开场白大概是这么个意思:零信任是个挺费劲的事情,甲方自己上是没戏的,你得找到能帮你干这个事的供应商。那如何来评估每天围在你门口的那么多乙方呢?有这么几个标准:首先就是要态度端正,你必须让他指天发誓,他们相信零信任这件事情就是人民群众大救星,只有零信任才能拯救网络安全。而且他们必须得有真本事,他们的产品确实能在零信任架构中有一个独特的价值,而不是来碰瓷的(deliver real Zero Trust capabilities),看来挂羊头卖狗肉这事儿也不光是咱国内的特色。除了态度端正之外,首条具体的安全能力要求就是支持微隔离! 下面的那些个要求就不在本文讨论了,就是让您感觉一下微隔离在零信任技术体系中的地位是什么。 我们再看下同样在这篇报告里的这个图: 这是Forrester观察到的市场上的有效供应商。越靠右边的战略越先进,越靠上边的技术越好。从这张图可以明显的看到,就当下而言,技术较好的是illumio,那么illumio是做啥的呢?业内人士都知道,他就是做微隔离的,全球十三只安全独角兽之一,微隔离市场的扛把子。 通过对Forrester报告的分析,大家不难理解微隔离之于零信任的价值。那么从理论上分析,为啥微隔离这么重要呢。因为微隔离要实现的核心能力就是两条,数据中心内工作负载之间的流量可视以及访问控制。大家可以回头再看看前面那张图,零信任能力究竟是个啥能力?本质上就是俩能力,一个是看得尽量多,一个是管得尽量细。而恰恰这就是微隔离主要在做的事情。领先的微隔离产品,能够做在十万点级别的数据中心内做到容器间流量的识别与访问控制,甚至能做到基于进程的访问控制,这个细粒度正是零信任所要求的。 微隔离技术的当下和远方 作为微隔离技术在国内的积极倡导者,也是只做微隔离这一件事的厂商,蔷薇灵动做了很多的微隔离项目,服务的客户包括三桶油,五大行,三大运营商,平安、京东等等云计算领域的头部企业。在这个过程中,一方面我们见证了微隔离技术是如何帮助用户将一个个高度复杂的虚拟化网络看清楚、管明白的。另一个方面,我们也深刻地认识到,微隔离这项技术所面临的挑战仍然非常的巨大。具体而言,我可以用“多快好省”这四个字来做个概括: 1. 多: 跟得上用户计算密度膨胀的脚步 计算密度膨胀这件事情,给我们留下的印象非常深刻。我们的一个客户刚开始试用我们的产品的时候,他们的体量在四五千点这样一个级别,而今年他们的计划是,扩容到2万点。另一个客户更夸张,在购买我们产品的时候,他们的规模大概是十万点,但是今年我们在产品上线的时候,他们告诉我们说,他们刚刚做了战略决策,全面容器化,目前毛估体量在100万点左右! 而微隔离这件事情,要回答的是点和点之间的关系问题。从算法复杂度的角度讲,他与所管理的点数之间是个n的平方的关系。再考虑到,点和点之间的通信是一个时刻都在发生的事情,而微隔离需要记录并分析每一次访问,然后再随着时间的累积,这个数量级就接近了n的3次方了。这意味着什么呢,如果管理规模扩大一倍,那么对算力的要求会扩大8倍。所以对于大规模网络的支撑是微隔离最重要的一个技术难点。大家这里一定要注意一个区别,不是说你能够部署安装多少点,而是说你能不能把这些点之间的关系完整、准确、实时地分析出来。目前我们可以实现用三台云主机作为算力,来支撑万点级别的场景,但是根据Illumio的公开资料,他们要支持一万五千点的时候,就需要6台专用的高主频物理服务器了,大家可以想象百尺竿头更进一步会有多难。而这个能力,相较于我们用户计算体量的膨胀速度而言还是不够。 所以我这里可以给大家一个判断标准,在过去评估防火墙的最主要指标是吞吐量,包括延迟,每秒新建,并发等等指标。而微隔离技术的核心指标就在于它能够管理的工作负载的规模。 2. 快:跟得上微服务架构飘渺的跑位 正如您看到的,容器在计算密度膨胀这个过程中扮演了非常重要的角色。一个方面,K8S的成熟和便捷,以及对于DEVOPS理念的良好支撑,使得越来越的客户在快速的拥抱容器。但是,从另一个方面,这也对各种运维技术提出了很严峻的挑战。就微隔离技术而言,一个非常大的挑战是策略计算速度问题。 微隔离是一种典型的软件定义安全结构。它的策略是由一个统一的计算平台来计算的,而且需要根据虚拟化环境的变化,做实时的自适应策略重算。问题就在这个地方,对于私有云环境而言,一个虚机的生命周期很长,从几周到几个月乃至几年都有可能,这个时候对于策略的计算速度其实没有特别高的要求。但是在K8S的环境下,情况发生了巨大的变化。由于容器的创建和销毁非常方便,使得容器的生命周期往往非常短,甚至只有几分钟。这就对策略计算的速度提出了很严格的要求,再加上往往容器环境的体量都非常巨大,就让这个策略计算的难度更高了。这种酸爽的感觉怎么形容呢,大概就是这么个意思: 给你一麻袋沙子,然后问你每一粒沙子叫啥名?他们之间什么关系? 矮油,没想到你居然知道。 好吧,现在把袋子在地上摔个五六遍。 然后问你,他们都叫啥名?他们之间什么关系? 你有5秒钟的时间,5,4,3… 3. 好:企业级产品必须具备企业级特性 企业级产品的功能特性,符合冰山模型。我们能够看得见摸得着的功能大概只占整个产品功能的10%,90%的功能都是水面之下的非功能特性,或者我们称之为企业级特性。 谈到这,我们扯个闲篇,说说80/20这个事。这确实是个神奇的法则,在各个领域似乎都有用。从产品研发的角度看,我们大概只需要用别人20%的工作量,就能实现人家产品80%的功能,事实上这是我们国内过去很长时间大家指导产品研发的原则,先解决有无问题嘛,最重要的就是快,要啥自行车呀,又不是不能过…。但是企业级产品的本质要求恰恰相反,我们必须要投入绝大部分的工作量去解决那剩下的20%,因为就是这20%才是决定一个产品能否真正被部署在核心业务系统的关键。 更严峻的挑战是,很多时候你并不知道你缺失的企业级特性是什么,直到你在客户现场遇到他!比如说我们在实验室里能够模拟出几百点的真实环境,也可以通过流量发生器构造出万点级别的虚假环境。但是无论如何你造不出一个万点级别的真实生产环境,就好像你没办法在你的实验室里真实再现出淘宝的全部交易一样,哪怕只是一秒钟的交易。所以有很多在大压力下才会出现的问题,就会被隐藏起来,一直到你的产品在真实的场景上线。这就好像你的头上一直悬着一把达摩克里斯之剑,让人始终有一种如坐针毡如履薄冰的感觉。 所以呢,一个方面我们始终投入很大的精力在这个方面,尽全力去提升我们的企业级特性。另一个方面呢,大家在评估微隔离产品的时候,一定要关注他们是否有大规模场景的交付经验和大规模的现网稳定运转的案例,要评估他们是否真的能够支撑你的云计算发展战略。 4. 省:在产品发展的过程中保持克制 这一条,既是我们要分享给大家的一个产品设计的指导原则,也算是对我们自己的一个警醒吧。 首先我们要提出一个方法论,那就是“产品研发的不可能三角“,这个方法论是应该我们独家提出的(当然,本文里的方法论基本都是我们独家提出的)。什么是不可能三角呢:就是在产品功能的丰富性,产品功能的专业性,以及计算开销这三者之间,你最多只能选择两者。 比如说,你可以选择产品功能很丰富,计算开销也比较低,那么你的每一项功能的实现水平势必比较初级。比如面向中小客户市场的产品,往往选择这种产品战略。 或者,你也可以选择产品功能很丰富,而且每一项功能的实现水平也很高,那么你势必需要很多的计算资源。比如我们过去的边界型安全产品,一个数据中心,只需要两台,每台设备都是4U,两台就能装满一个机柜。 对于微隔离而言,一个最主要的限制就是计算开销问题。由于微隔离需要对整个数据中心内部做点到点的访问控制,所以他的控制点的分布应该是尽可能的广。正如我们前面说的,我们能做到每一个容器都有一个控制点。但是部署量如此的巨大,就要求你单个控制点的计算开销必须尽量的小。举个例子吧,现代一个云计算数据中心的造价,少则两三个亿,多则十几个亿。我们就说两个亿吧,那么如果单控制点计算开销增长1%,就意味着这个数据中心要多拿出价值200万的计算资源! 所以,根据不可能三角,我们就必须在功能丰富性与功能的完善性之间做个二选一的选择,再结合我们前面对微隔离所面临的技术挑战的描述,那么其实我们能选择的路就只有一条,那就是选择少而精,而不是多而粗。 道理是明显的,但是要做得到,真还挺考验人性的。作为一家高科技创业企业,无论是从客户的要求来说,还是从我们对新技术的偏好来说,我们都有极大的冲动去做更多的安全能力。但这个时候,我们就必须始终牢记我们的产品边界,始终牢记,我们是要在超大规模生产环境交付的企业级产品!然后就只能看着一个个热点生生灭灭,看着在不同的风口中,一只只小金猪飞翔天际,看着一只只独角兽从我们面前飞奔而过,而我们只能掸掸飞扬的尘土,回去再做下一轮的版本迭代。 【责任编辑: 蓝雨泪 TEL:(010)68476606】

优秀的个人博客,低调大师

mica v2.0.0 强化基础工具集

mica(云母) mica 云母,寓意为云服务的核心,增强 Spring cloud 功能,使得 Spring cloud 服务开发更加方便快捷。 mica 2.x核心依赖 mica 基于 java 8,没有历史包袱,支持传统 Servlet 和 Reactive(webflux)。采用 mica-auto 自动生成 spring.factories 和 spring-devtools.properties 配置,仅依赖 Spring boot、Spring cloud 全家桶,无第三方依赖。市面上鲜有的微服务核心组件。 依赖 版本 Spring Boot 2.2.x 关于此版本 此次版本相比 mica 1.x 少了一些模块,主要原因如下: mica-launcher、 mica-boot-testmica 2.x中采用新方式给精简掉了。 部分模块本次版本暂不开源,后续会逐步开放。 部分模块开发层度比较低,转到内部继续研发。 其他模块付费提供,付费版很多模块都已经打通。 知识付费,让你我走的更远!!! mica 2.x 现有模块示意图: 注意:左边开锁状态的模块,后续都会开放。 更新说明 ✨mica-http 支持指定协议 protocols。 ⚡mica-http 扩展 HttpRequest proxy 方法,方便使用。 ✨mica-http 拆出 mica-spider 爬虫工具,精简依赖。 ✨mica-spider 增强 CssQueryMethodInterceptor。 ⚡mica-captcha 验证码抽象,支持数学计算型验证码。 ✨mica-captcha 验证码缓存接口,完善验证码生成说明。 ✨mica-swagger 升级 swagger 到 knife4j。 ✨mica-redis 限流算法改为同 Spring cloud gateway,减少内存占用。 ✨mica-jobs 添加 xxl-job starter。 ✨mica-core 生成 mica 版本信息到 Mica 类中。 ✨mica-core 添加 compiler 工具类。 ✨mica-core 添加用于计数的 CountMap。 ✨mica-core 添加 Once 对象。 ✨mica-core 中的 jackson 包移动到 mica-boot,并做调整用于支持 mica-api-encrypt 组件。 ✨mica-core 简化 aes 工具类代码。 ⚡mica-core 优化 DateUtil。 ⚡mica-core 优化 RuntimeUtil。 ✨mica-core 拆解完善 HexUtil。 ✨mica-core 添加 DesUtil。 ✨mica-core 添加 RsaUtil。 ✨mica-core 优化 ResourceUtil 工具类。 ✨mica-core 微调 Bean copy。 ✨mica-core function 添加序列化。 ✨mica-core MD5 不再依赖 Spring DigestUtils。 ✨mica-core 优化 file 工具对文件名处理。 ⚡add .gitattributes。 ⚡ @configuration 替换为 @configuration(proxyBeanMethods = false)。 ⬆️升级 okhttp 到 3.14.8。 ⬆️升级 jsoup 到 1.13.1。 ⬆️升级 mica-auto 到 1.2.2。 ⬆️升级 spring boot 到 2.2.6,不再支持,spring boot 2.2.x 以下版本。 ⬆️升级 spring cloud 到 Hoxton.SR4。 文档 mica 源码 Github:https://github.com/lets-mica mica 源码 Gitee(码云):https://gitee.com/596392912/mica 文档地址(官网):https://www.dreamlu.net/mica2x/index.html 文档地址(语雀-可关注订阅):https://www.yuque.com/dreamlu 示例项目:https://github.com/lets-mica/mica-example 欢迎关注我们的公众号:JAVA架构日记,精彩内容每日推送。

优秀的个人博客,低调大师

JetLinks 物联网基础平台 1.0 RELEASE 发布

更新时间: 2020-04-01 主要优化: 重构elasticsearch-component模块. 优化elasticsearch索引管理,支持自定义策略,如按月对索引分表. 增加GeoType类型支持,为未来的Gis支持作准备. 增加网关设备功能.见:通过网关设备接入多个下挂设备 增加属性变更Dashboard接口,可同时订阅一个设备对所有属性变更事件. 优化设备协议,增加调试功能. 增加脚本支持(PRO). 增加设备功能调用,可在界面发起功能调用指令. 增加设备标签功能,可自定义设备标签,可通过标签查询设备: where("id$dev-tag","location:重庆市"); //查询标签key为location,value为重庆市的设备. 优化消息网关中的设备消息topic,详见:从消息网关中订阅设备消息 DeviceMessage增加头:Headers.keepOnline,用于在TCP短连接的场景保持设备一直在线,仅通过keepalive超时判断离线. 消息网关增加集群支持,在任意一个服务节点都可订阅设备消息.(PRO) 增加UDP设备网关,可通过UDP接入设备了(PRO). 增加CoAP设备网关,可通过CoAP接入设备了(PRO). 设备会话支持手动指定心跳超时时间以及获取客户端地址信息. 优化批量upsert,提升批量导入性能. 性能优化,详见压力测试. 一系列UI优化. 主要BUG修复: 修复使用save保存的数据中有字段使用默认值时,更新数据会导致字段被更新为默认值的问题. 修复选择网络协议时出现重复选项. 修复设备属性和事件历史记录部分类型无法展示问题. 修复无法将excel大文件导入设备实例的的问题. 修复在某些情况下redis超时后的NPE错误. 修复无法导出设备问题. 修复当设备数量较多时同步设备状态可能导致崩溃的问题.

优秀的个人博客,低调大师

Java基础知识的27个点

云栖号:https://yqh.aliyun.com第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 1、JAVA中的几种基本数据类型是什么,各自占用多少字节。 2、String类能被继承吗,为什么 不能。在Java中,只要是被定义为final的类,也可以说是被final修饰的类,就是不能被继承的。 3、String,Stringbuffer,StringBuilder的区别。 4、ArrayList和LinkedList有什么区别。 简单的区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous) 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 深度的区别: 1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。 2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。 3.LinkedList不支持高效的随机元素访问。 4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间 5、讲讲类的实例化顺序。 问题:比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字 段,当new的时候,他们的执行顺序。 答案: 类加载器实例化时进行的操作步骤(加载–>连接->初始化)。 父类静态变量、 父类静态代码块、 子类静态变量、 子类静态代码块、 父类非静态变量(父类实例成员变量)、 父类构造函数、 子类非静态变量(子类实例成员变量)、 子类构造函数。 6、用过哪些Map类,都有什么区别。 问题:比如HashMap是线程安全的吗,并发下使用的Map是什么,他们 内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。 答案: 不安全,并发下使用ConcurrentHashMap。 7、JAVA8的ConcurrentHashMap为什么放弃了分段锁? 原因:通过 JDK 的源码和官方文档看来, 他们认为的弃用分段锁的原因由以下几点: 1、加入多个分段锁浪费内存空间。 2、生产环境中, map 在放入时竞争同一个锁的概率非常小,分段锁反而会造成更新等操作的长时间等待。 3、为了提高 GC 的效率 既然弃用了分段锁, 那么一定由新的线程安全方案, 我们来看看源码是怎么解决线程安全的呢?CAS 首先通过 hash 找到对应链表过后, 查看是否是第一个object, 如果是, 直接用cas原则插入,无需加锁,然后如果不是链表第一个object, 则直接用链表第一个object加锁,这里加的锁是synchronized,虽然效率不如 ReentrantLock, 但节约了空间,这里会一直用第一个object为锁, 直到重新计算map大小, 比如扩容或者操作了第一个object为止。 8、ConcurrentHashMap(JDK1.8)为什么要使用synchronized而不是如ReentranLock这样的可重入锁? 可以从下面几个方面讲述: 锁的粒度 首先锁的粒度并没有变粗,甚至变得更细了。每当扩容一次,ConcurrentHashMap的并发度就扩大一倍。 Hash冲突 JDK1.7中,ConcurrentHashMap从过二次hash的方式(Segment -> HashEntry)能够快速的找到查找的元素。在1.8中通过链表加红黑树的形式弥补了put、get时的性能差距。 扩容 JDK1.8中,在ConcurrentHashmap进行扩容时,其他线程可以通过检测数组中的节点决定是否对这条链表(红黑树)进行扩容,减小了扩容的粒度,提高了扩容的效率。 为什么是synchronized,而不是可重入锁 减少内存开销 假设使用可重入锁来获得同步支持,那么每个节点都需要通过继承AQS来获得同步支持。但并不是每个节点都需要获得同步支持的,只有链表的头节点(红黑树的根节点)需要同步,这无疑带来了巨大内存浪费。获得JVM的支持 可重入锁毕竟是API这个级别的,后续的性能优化空间很小。 synchronized则是JVM直接支持的,JVM能够在运行时作出相应的优化措施:锁粗化、锁消除、锁自旋等等。这就使得synchronized能够随着JDK版本的升级而不改动代码的前提下获得性能上的提升。9、有没有有顺序的Map实现类,如果有,他们是怎么保证有序的。 Hashmap和Hashtable 都不是有序的。 TreeMap和LinkedHashmap都是有序的。(TreeMap默认是key升序,LinkedHashmap默认是数据插入顺序) TreeMap是基于比较器Comparator来实现有序的。 LinkedHashmap是基于链表来实现数据插入有序的。 10、抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口 么。 区别: 1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。 2、抽象类要被子类继承,接口要被类实现。 3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现 4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。 5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。 6、抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。 7、抽象类里可以没有抽象方法 8、如果一个类里有抽象方法,那么这个类只能是抽象类 9、抽象方法要被实现,所以不能是静态的,也不能是私有的。 10、接口可继承接口,并可多继承接口,但类只能单根继承。 类不能继承多个类 接口可以继承多个接口 类可以实现多个接口 11、继承和聚合的区别在哪。 继承 指的是一个类继承另外的一个类的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识。 聚合 聚合体现的是整体与部分、拥有的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期;比如计算机与CPU、公司与员工的关系等; 12、IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。 各IO的区别: reactor是什么? 事件驱动可以处理一个或多个输入源通过Service Handle同步的将输入事件采用多路复用分发给相应的Request Handler(一个或多个)处理 13、反射的原理,反射创建类实例的三种方式是什么。 //创建Class对象的方式一:(对象.getClass()),获取类中的字节码文件 Class class1 = p1.getClass(); //创建Class对象的方式二:(类.class:需要输入一个明确的类,任意一个类型都有一个静态的class属性) Class class3 = Person.class; //创建Class对象的方式三:(forName():传入时只需要以字符串的方式传入即可) //通过Class类的一个forName(String className)静态方法返回一个Class对象,className必须是全路径名称; //Class.forName()有异常:ClassNotFoundException Class class4 = Class.forName("cn.xbmchina.Person"); 14、反射中,Class.forName和ClassLoader区别 。 Class.forName(className)方法,内部实际调用的方法是 Class.forName(className,true,classloader); 第2个boolean参数表示类是否需要初始化, Class.forName(className)默认是需要初始化。 一旦初始化,就会触发目标对象的 static块代码执行,static参数也也会被再次初始化。 ClassLoader.loadClass(className)方法,内部实际调用的方法是 ClassLoader.loadClass(className,false); 第2个 boolean参数,表示目标对象是否进行链接,false表示不进行链接,由上面介绍可以, 不进行链接意味着不进行包括初始化等一些列步骤,那么静态块和静态对象就不会得到执行 15、描述动态代理的几种实现方式,分别说出相应的优缺点。 原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用CGLIB实现AOP? (1)添加CGLIB库,SPRING_HOME/cglib/*.jar (2)在spring配置文件中加入 JDK动态代理和CGLIB字节码生成的区别? (1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类 (2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 因为是继承,所以该类或方法最好不要声明成final 16、final的用途。 1、被final修饰的类不可以被继承 2、被final修饰的方法不可以被重写 3、被final修饰的变量不可以被改变(切记不可变的是变量的引用而非引用指向对象的内容。) 4、被final修饰的方法,JVM会尝试为之寻求内联,这对于提升Java的效率是非常重要的。因此,假如能确定方法不会被继承,那么尽量将方法定义为final的,具体参见运行期优化技术的方法内联部分 5、被final修饰的常量,在编译阶段会存入调用类的常量池中,具体参见类加载机制最后部分和Java内存区域 17、写出三种单例模式实现 。 1 饿汉式 public class EagerSingleton {static { System.out.println("EagerSingleton 被加载");} //私有化构造方法,限制直接构造,只能调用 getInstance() 方法获取单例对象private EagerSingleton(){} private static final EagerSingleton eagerSingleton=new EagerSingleton(); // 私有化静态 final成员,类加载直接生成单例对象,比较占用内存 public static EagerSingleton getInstance(){ //提供对外的公共api获取单例对象 return eagerSingleton;} } 总结:饿汉式单例的特点:饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成。 2 懒汉式 public class LazySingleton {static { System.out.println("LazySingleton 被加载");}private LazySingleton(){} //私有化构造方法,限制直接构造,只能调用 getInstance() 方法获取单例对象private static LazySingleton lazySingleton=null;//静态域初始化为null,为的是需要时再创建,避免像饿汉式那样占用内存public static LazySingleton getInstance(){//提供对外的公共api获取单例对象 if(lazySingleton==null){ synchronized (LazySingleton.class){ //在getInstance中做了两次null检查,确保了只有第一次调用单例的时候才会做同步,这样也是线程安全的,同时避免了每次都同步的性能损耗 if(lazySingleton==null){ lazySingleton = new LazySingleton(); } } } return lazySingleton; }} 总结:有同步锁的性能消耗 3 静态内部类实现 public class IoDHSingleton {static {System.out.println("IoDHSingleton 被加载");}private IoDHSingleton(){} //私有化构造方法,限制直接构造,只能调用 getInstance() 方法获取单例对象public static IoDHSingleton getInstance(){//提供对外的公共api获取单例对象//当getInstance方法第一次被调用的时候,它第一次读取HolderClass.ioDHSingleton,内部类HolderClass类得到初始化;//而这个类在装载并被初始化的时候,会初始化它的静态域,从而创ioDHSingleton 的实例,由于是静态的域,因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性。 return HolderClass.ioDHSingleton; } private static class HolderClass{ static { System.out.println("HolderClass 被加载"); } private static IoDHSingleton ioDHSingleton = new IoDHSingleton(); } // 防止反序列化获取多个对象的漏洞 private Object readResolve() throws ObjectStreamException { return HolderClass.ioDHSingleton; } }这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本。 考虑反射: 由于在调用 SingletonHolder.instance 的时候,才会对单例进行初始化,而且通过反射,是不能从外部类获取内部类的属性的。 所以这种形式,很好的避免了反射入侵。 考虑多线程: 由于静态内部类的特性,只有在其被第一次引用的时候才会被加载,所以可以保证其线程安全性。 总结: 优势:兼顾了懒汉模式的内存优化(使用时才初始化)以及饿汉模式的安全性(不会被反射入侵)。 劣势:需要两个类去做到这一点,虽然不会创建静态内部类的对象,但是其 Class 对象还是会被创建,而且是属于永久带的对象。 18、如何在父类中为子类自动完成所有的hashcode和equals实现?这么做有何优劣。 19、请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设计中的作用。 访问修饰符,主要标示修饰块的作用域,方便隔离防护。 public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。 private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。 protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。 default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。 20、深拷贝和浅拷贝区别。 浅拷贝(Shallow Copy): ①对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据。 ②对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值。 深拷贝: 首先介绍对象图的概念。设想一下,一个类有一个对象,其成员变量中又有一个对象,该对象指向另一个对象,另一个对象又指向另一个对象,直到一个确定的实例。这就形成了对象图。那么,对于深拷贝来说,不仅要复制对象的所有基本数据类型的成员变量值,还要为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象。也就是说,对象进行深拷贝要对整个对象图进行拷贝! 简单地说,深拷贝对引用数据类型的成员变量的对象图中所有的对象都开辟了内存空间;而浅拷贝只是传递地址指向,新的对象并没有对引用数据类型创建内存空间。 21、数组和链表数据结构描述,各自的时间复杂度。 数组和链表的区别: 1、从逻辑结构角度来看: 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项) 2、数组元素在栈区,链表元素在堆区; 3、从内存存储角度来看: (静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小。 链表从堆中分配空间, 自由度大但申请管理比较麻烦。 数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n); 数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。 22、error和exception的区别,CheckedException,RuntimeException的区别。 23、在自己的代码中,如果创建一个java.lang.String类,这个类是否可以被类加载器加载?为什么。 加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是说当发现这个类没有的时候会先去让自己的父类去加载,父类没有再让儿子去加载,那么在这个例子中我们自己写的String应该是被Bootstrap ClassLoader加载了,所以App ClassLoader就不会再去加载我们写的String类了,导致我们写的String类是没有被加载的。 24、说一说你对java.lang.Object对象中hashCode和equals方法的理解。在什么场景下需要重新实现这两个方法。 对于equals()与hashcode(),比较通用的规则: ①两个obj,如果equals()相等,hashCode()一定相等 ②两个obj,如果hashCode()相等,equals()不一定相等 25、在jdk1.5中,引入了泛型,泛型的存在是用来解决什么问题。 面向对象的转型只会发生在具有继承关系的父子类中(接口也是继承的一种) 向上转型:其核心目的在于参数的统一上,根本不需要强制类型转换。 向下转型:是为了操作子类定义的特殊功能,需要强制类型转换,可是现在存在的问题是:向下转型其实是一种非常不安全的操作,以为编译的时候,程序不会报错,而在运行的时候会报错,这就是传说中的—迷之报错。 不过呢,在JDK1.5之后,新增加了泛型的技术,这就将上述向下转型的问题消灭在了萌芽之中。 泛型的核心意义在于:类在进行定义的时候可以使用一个标记,此标记就表示类中属性或者方法以及参数的类型,标记在使用的时候,才会去动态的设置类型。 26、Java中的HashSet内部是如何工作的。 HashSet 的内部采用 HashMap来实现。由于 Map 需要 key 和 value,所以HashSet中所有 key 的都有一个默认 value。类似于 HashMap,HashSet 不允许重复的 key,只允许有一个null key,意思就是 HashSet 中只允许存储一个 null 对象。 27、什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。 什么是序列化? 序列化:把对象转换为字节序列的过程称为对象的序列化。 反序列化:把字节序列恢复为对象的过程称为对象的反序列化 什么情况下需要序列化? 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候; 当你想用套接字在网络上传送对象的时候; 当你想通过RMI传输对象的时候; 如何实现序列化? 实现Serializable接口即可 注意事项: transient 修饰的属性,是不会被序列化的 静态static的属性,他不序列化。 实现这个Serializable 接口的时候,一定要给这个 serialVersionUID 赋值 关于 serialVersionUID 的描述: 序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。可序列化类可以通过声明名为 “serialVersionUID” 的字段(该字段必须是静态 (static)、最终 (final) 的 long 型字段)显式声明其自己的 serialVersionUID 云栖号:https://yqh.aliyun.com第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 原文发布时间:2020-01-19本文作者:长安街本文来自阿里云云栖号合作伙伴“oschina”,了解相关信息可以关注“oschina”

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册