JVM(三) 字段访问相关优化1.即时编译器将沿着控制流缓存字段存储、读取的值,并在接下来的字段读取操作时直接使用该缓存值。2.这要求生成缓存值的访问以及使用缓存值的读取之间没有方法调用、内存屏障,或者其他可能存储该字段的节点。3.即时编译器还会优化冗余的字段存储操作。如果一个字段的两次存储之间没有对该字段的读取操作、方法调用以及内存屏障,那么即时编译器可以将第一个冗余的存储操作给消除掉。4.此外,我还...
JVM(二) Java内存模型1.Java 内存模型通过定义了一系列的 happens-before 操作,让应用程序开发者能够轻易地表达不同线程的操作之间的内存可见性。2.在遵守 Java 内存模型的前提下,即时编译器以及底层体系架构能够调整内存访问操作,以达到性能优化的效果。如果开发者没有正确地利用 happens-before 规则,那么将可能导致数据竞争。3.Java 内存模型是通过内存屏障来禁止...
(笔记整合)Java并发编程三 Immutability模式解决并发问题,其实最简单的办法就是让共享变量只有读操作,而没有写操作。这个办法如此重要,以至于被上升到了一种解决并发问题的设计模式:不变性(Immutability)模式。所谓不变性,简单来讲,就是对象一旦被创建之后,状态就不再发生变化。换句话说,就是变量一旦被赋值,就不允许修改了(没有写操作);没有修改操作,也就是保持了不变性。快速实现具备不可变性的类实现一个具...
(笔记整合)Java并发编程二 Lock和Condition再造管程的理由:能够响应中断。synchronized 的问题是,持有锁 A 后,如果尝试获取锁 B 失败,那么线程就进入阻塞状态,一旦发生死锁,就没有任何机会来唤醒阻塞的线程。但如果阻塞状态的线程能够响应中断信号,也就是说当我们给阻塞的线程发送中断信号的时候,能够唤醒它,那它就有机会释放曾经持有的锁 A。这样就破坏了不可抢占条件了。支持超时。如果线程在一段时间...
(笔记整合)Java并发编程一 其实并发编程可以总结为三个核心问题:分工、同步、互斥所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共享资源。Java SDK 并发包很大部分内容都是按照这三个维度组织的,例如 Fork/Join 框架就是一种分工模式,CountDownLatch 就是一种典型的同步方式,而可重入锁则是一种互斥手段。如何才能学好并发编程?并发...
利用IDEA合并git分支 首先在命令终端里面执行git pull拉取最新分支信息。然后切换到该分支。搜索需要合并过来的分支,然后选merge into current。合并后解决完冲突提交就OK了。如果提交被拒绝了再拉一下代码看看是不是有人在解决冲突期间又提交的新的代码。...
(笔记整合)回溯算法 一、如何理解“回溯算法”?在我们的一生中,会遇到很多重要的岔路口。在岔路口上,每个选择都会影响我们今后的人生。有的人在每个岔路口都能做出最正确的选择,最后生活、事业都达到了一个很高的高度;而有的人一路选错,最后碌碌无为。如果人生可以量化,那如何才能在岔路口做出最正确的选择,让自己的人生“最优”呢?可以借助前面学过的贪心算法,在每次面对岔路口的时候,都做出看起来最优的选择,期望这一组选择可以使得...
(笔记整合)分治算法 一、如何理解分治算法?分治算法(divide and conquer)的核心思想其实就是四个字,分而治之,也就是将原问题划分成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。这个定义看起来有点类似递归的定义。关于分治和递归的区别,在排序(下)的时候讲过,分治算法是一种处理问题的思想,递归是一种编程技巧。实际上,分治算法一般都比较适合用递归来...
(笔记整合)贪心算法 一、如何理解“贪心算法”?假设有一个可以容纳100kg物品的背包,可以装各种物品。有以下5种豆子,每种豆子的总量和总价值都各不相同。为了让背包中所装物品的总价值最大,如何选择在背包中装哪些豆子?每种豆子又该装多少呢?只要先算一算每个物品的单价,按照单价由高到低依次来装就好了。单价从高到低排列,依次是:黑豆、绿豆、红豆、青豆、黄豆,所以可以往背包里装20kg黑豆、30kg绿豆、50kg红豆。...
(笔记整合)Trie树 一、什么是“Trie树”?Trie树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。Trie树到底长什么样子?比如有6个字符串,它们分别是:how,hi,her,hello,so,see。希望在里面多次查找某个字符串是否存在。如果每次查找,都是拿要查找的字符串跟这6个字符串依次进行字符串匹配,那效率就比较低...
(笔记整合)字符串匹配基础 一、BF算法?BF算法中的BF是Brute Force的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好懂,但相应的性能也不高。在字符串A中查找字符串B,那字符串A就是主串,字符串B就是模式串。把主串的长度记作n,模式串的长度记作m。因为是在主串中查找模式串,所以n>m。作为最简单、最暴力的字符串匹配算法,BF算法...
(笔记整合)Java基础四 三十一、Java应用开发中的注入攻击典型回答注入式(Inject)攻击是一类非常常见的攻击方式,其基本特征是程序允许攻击者将不可信的动态内容注入到程序中,并将其执行,这就可能完全改变最初预计的执行过程,产生恶意效果。下面是几种主要的注入式攻击途径,原则上提供动态执行能力的语言特性,都需要提防发生注入攻击的可能。最常见的SQL注入攻击。一个典型的场景就是Web系统的用户登录功能,根据用户输...
(笔记整合)Java基础三 二十一、Java并发类库提供的线程池有哪几种? 分别有什么特点?典型回答通常开发者都是利用Executors提供的通用线程池创建方法,去创建不同配置的线程池,主要区别在于不同的ExecutorService类型或者不同的初始参数。Executors目前提供了5种不同的线程池创建配置:newCachedThreadPool(),它是一种用来处理大量短时间工作任务的线程池,具有几个鲜明特点:...
(笔记整合)Java基础二 十一、Java提供了哪些IO方式? NIO如何实现多路复用?典型回答Java IO方式有很多种,基于不同的IO抽象模型和交互方式,可以进行简单区分。首先,传统的java.io包,它基于流模型实现,提供了我们最熟知的一些IO功能,比如File抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的...
(笔记整合)Java基础一 一、谈谈你对Java平台的理解Java特性:面向对象(封装,继承,多态)平台无关性(JVM运行.class文件)语言(泛型,Lambda)类库(集合,并发,网络,IO/NIO)JRE(Java运行环境,JVM,类库)JDK(Java开发工具,包括JRE,javac,诊断工具)Java是解析运行吗?不正确!1.Java源代码经过Javac编译成.class文件2. .class...
(笔记整合)堆 一、如何理解“堆”?堆是一种特殊的树。只要满足这两点,它就是一个堆。堆是一个完全二叉树;堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。对于每个节点的值都大于等于子树中每个节点值的堆,我们叫作“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,我们叫作“小顶堆”。其中第111个和第222个是大顶堆,第333个是小顶堆,第444个不是堆。二、如何实现一个...
(笔记整合)红黑树 一、什么是“平衡二叉查找树”?平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于1。从这个定义来看,我们讲的完全二叉树、满二叉树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。但是很多平衡二叉查找树其实并没有严格符合上面的定义,我们学习数据结构和算法是为了应用到实际的开发中的,所以,没必去死抠定义。对于平衡二叉查找树这个概念,我们要从这个数据结构的由来,...
(笔记整合)二叉树 一、树1.树的常用概念根节点、叶子节点、父节点、子节点、兄弟节点,还有节点的高度、深度以及层数,树的高度。2.概念解释节点:树中的每个元素称为节点父子关系:相邻两节点的连线,称为父子关系根节点:没有父节点的节点叶子节点:没有子节点的节点父节点:指向子节点的节点子节点:被父节点指向的节点兄弟节点:具有相同父节点的多个节点称为兄弟节点关系节点的高度:节点到叶子节点的最长路径所包含...
(笔记整合)哈希算法 一、什么是哈希算法?1.定义将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。2.如何设计一个优秀的哈希算法?①单向哈希:从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。②篡改无效:对输入敏感,哪怕原始数据只修改一个Bit,最后得到的哈希值也大不相同。③散列冲突:散列冲突的概率要很小,对于...