java
mylike_java
非宁静不能至远
展开
-
聊聊并发编程-java内存模型
上一节中讲了可见性,原子性和有序性问题产生的源头。这一节我们就来讲讲如何解决可见性,有序性问题。 通过上节我们知道可见性是由于CPU缓存引起的,有序性是由于编译器重排优化引起的。 那么解决可见性和有序性最简单的方案就是禁用CPU缓存和禁止指令重排。但是如果我们直接粗暴的禁止也就享受不了CPU缓存和指令重排带来的性能优化的成果了。最好的办法是能够提供禁止使用CPU缓存和指令重排的方法,由我...原创 2019-12-13 16:12:22 · 107 阅读 · 0 评论 -
聊聊并发编程-可见性,原子性和有序性
并发是提升性能的利器,同时也是最容易出bug的。编写正确的并发程序是一件比较困难的事情。并发程序的bug往往会很诡异,同时又难以重现,调试,让人抓狂。但如果我们能理解并发的本质,抽丝剥茧,并能快速,精准的找出产生问题的源头。接下来我们就来分析一下并发问题产生的源头。 大家都知道CPU,内存,IO设备这三者的速度相差悬殊。我们的程序会有访问内存,IO。根据木桶原理程序的性能取决于...原创 2019-11-25 14:43:51 · 197 阅读 · 0 评论 -
从源码角度解析Vector特性
Vector它和lArrayList一样,实现了List接口。且它的底层数据存储也和ArrayList一样,用数组进行存储数据。所以这里就不在过多讲述Vector存储查询原理了。想要了解相关原理的童鞋,可以查看我前面ArrayList相关博客。 在这里主要讲下Vector与ArrayList不同点。最大的不同点就是Vector是线程安全的,ArrayList不是线程安全的。这里讲下为什么Ve原创 2017-11-10 14:13:43 · 267 阅读 · 0 评论 -
从源码角度解析HashMap特性
HashMap实现了Map接口,主要用于存储键值对数据。它是java开发中高频使用的一个API,接下来我们就通过源码来分析它是如何工作的,以及具有哪些特性。 首先来看看它是如何存储数据的,我们最常用的map.put(K,V)方法 我们调用put方法的时候其实内部调用的是putVal方法,这里一个值得关注的地方是hash(key)这个方法。我们先来看看它做了什原创 2017-11-14 17:33:02 · 296 阅读 · 0 评论 -
从源码角度解析LinkedList特性
前两天讲到了ArrayList,那么按照套路今天应该到LinkedList了。那么我们现在就开始来扒开LinkedList的外衣,看看它的内在 从名字上我们就能够知道LinkedList它的底层是通过链表来存储数据的,来看看它的源码。 OK,没有毛病。我们来看看Node类,它是怎么存储的 从上面可以看出Node保存当前节点内容,以及前后节点的引用,原创 2017-11-06 10:41:43 · 557 阅读 · 0 评论