本篇是自己记录自己VMware 无法安装VM tools,按官方指引安装open vm toos.
本篇借鉴大佬博客安装,原文链接
我们知道一个类创建的过程是: 首先是开辟空间,其次是初始化和指向空间地址,后面两个顺序可能不固定. 在此之前,JVM需要加载类文件到JVM,如果不加载那怎么知道该分配多大的存储空间呢,今天我们就来捋捋这个过程.
这次柯南要委托他爹妈了.
Java内存模型,简称JMM(java memory model),随着计算机性能的不断提升,计算机的运算速度与它的存储能力和通信子系统的速度差距越拉越大,计算机的运算速度高出存储和通信速度好多个量级,为了减少这种速度差异,因此但是了3级缓存.高速缓存虽然很好的解决了CPU和内存的速度矛盾,但是又引入了新的问题—缓存一致性问题. JMM 就是为了解决这类
如果是第一次看到类似这种代码的,会不会满脸的问号呢?
其实这JVM底层将class
文件转为机器能认识的汇编语言的结果.
如果想看懂这些指令,就必须认识这些指令是什么意思?今天这里就来告诉大家怎么从官网查询这些指令,而不是去看人家的帖子.
看过周志明的<深入了解Java虚拟机>,网上零零散散看到过相关的帖子,现在再回忆JVM,印象也是很模糊. 根据B站上记忆大师的推荐的方法,如果记住一个东西,首先需要理解它,最好类别,然后图形化它,这样记忆才会深刻. 所以今天又来画图了 —— 其实我是个画家.
这次我们要画的内容是 —– JVM.
之前在总结ReentrantLock
的时候说过, 鉴于JDK 1.5之前,JDK提供的synchronized
过于重量级,Doug Lea开发了ReentrantLock
.
如果你是oracle,你能接受得了这种打脸吗? oracle虚心接受,但是也奋起追击.随后在JDK 1.6中优化了synchronized
,使其性能和ReentrantLock
一样优秀.
Java线程的创建非常昂贵, 为了在有限资源的情况下, 又有线程需求的时候,我们希望线程能复用,这样就可以尽可能的减少创建,消耗线程的开销.因此就有了线程池 –ThreadPoolExecutor.
这里为什么一反常态,既不是放的类关系, 也不是放的柯南, 而是放的筷子,勺子的照片呢?
首先是真的想不到,怎么和柯南关联上.其二是类关系好像也没啥好放的.反倒是筷子到时很时候理解ThreadPoolExecutor的.在这里,我们把线程当做是筷子或者勺子, 筷子篓当做线程池.当我们需要筷子的时候, 但是我们又没有筷子,我们需要去买筷子,或者自己弄材料做筷子. 自己弄筷子的这个事情,比较麻烦, 就相当于系统创建线程一样,开销大.
如果我们用完筷子之后,直接丢弃, 那我们下次再有需要筷子的时候,我们又得麻烦一遍.
如果我们将筷子洗刷干净,放在筷子篓中,下次有需要我们直接从筷子篓中拿就好了,这样是不是更方便呢.
线程池也差不多是这个意思,下面我们就来图解ThreadPoolExecutor吧.
在读BlockingQueue源码–ArrayBlockingQueue(上篇)中有说过, 有想法后面将 BlockingQueue的众多子类都总结一遍,后面看了下,工程量好像有点大.
总结还是要总结的,食言是不可能食言的.
鉴于全部总结,需要工程浩大,所以我准备只研究其子类的特点.说干就干.
上篇我们图解生产者阻塞队列的场景,这篇,我们从消费者阻塞队列的场景,再来图解一次ArrayBlockingQueue.
BlockingQueue 是JUC包中的一个接口, 从名字可以看出是一个支持阻塞的队列. 在刚学Thread
的时候, 是否有被生产者-消费者问题难倒过? 在学Thread的时候主要学习解决 生产者-消费者问题
的思路, 如果现在在来解决这个问题, 我们就不用再手撸wait - notify
的代码了, BlockingQueue 就可以很轻松的解决这个问题, 下面我们就学习下 并发大神Doug Lea 是怎么解决这个问题的.