![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
_Kim
1261895547@qq.com
展开
-
Java核心技术14 | synchronized底层实现
synchronized代码块是由一对monitorenter/monitorexit指令实现的,Monitor对象是同步的基本实现单元。在Java 6 之前,Monitor的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作。内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一...原创 2019-03-29 14:32:55 · 231 阅读 · 0 评论 -
重温HashMap
问:HashMap 的工作原理是什么?答:使用 put(key, value) 存储对象到 HashMap 中,使用 get(key) 从 HashMap 中获取对象。当我们给 put() 方法传递键和值时,我们先对键调用 hashCode() 方法,计算并返回的 hashCode 是用于找到 Map 数组的 bucket 位置来储存 Node 对象。以下是具体的 put 过程(JDK1....转载 2019-03-22 16:41:36 · 109 阅读 · 0 评论 -
HashMap中的resize以及死链的情况
我们都知道HashMap是线程不安全的, 如果多线程来访问会有什么问题呢? 答案是会造成死锁。接下来我们就分析下为何会造成死锁。说到HashMap中死锁的情况, 我们就必须要先讲下resize()方法, 顾名思义, 这个方法就是来扩容的。当HashMap的size超过thredshold时, 就需要扩容了。 当我们put时:(截图代码为JDK7 HashMap源码)...转载 2019-03-22 17:57:43 · 1644 阅读 · 0 评论 -
Java核心技术10 | ConcurrentHashMap
JDK1.7及早期版本分离锁,将内部进行分段(Segment),里面则是HashEntry的数组,和HashMap类似,哈希相同的条目也是以链表的形式存放。 HashEntry内部使用volatile的value字段来保证可见性,也利用了不可变对象的机制以改进利用Unsafe提供的底层能力,比如volatile access,去直接完成部分操作,以最优化性能,毕竟Unsafe中的很多操作都是...原创 2019-03-23 15:06:14 · 217 阅读 · 0 评论 -
Java核心技术09 | Map
Hashtable、HashMap、TreeMap定义三者均实现了Map接口,存储的内容是基于key-value的键值对映射 HashTable是早期Java类库提供的一个哈希表实现,本身是同步的,不支持null键值,由于同步导致的性能开销,所以很少被推荐使用 HashMap是应用更加广泛的哈希表实现,行为上大致与HashTable一致,主要区别在于HashMap不是同步的,支持nul...原创 2019-03-22 23:45:03 · 97 阅读 · 0 评论 -
Java核心技术18 | 并发包中的常用队列
有时候我们把并发包下面的所有容器都习惯叫作并发容器,但是严格来讲,只有以“Concurrent”为前缀的容器才是真正的并发容器。Concurrent类型基于lock-free,在常见的多线程访问场景,一般可以提供较高吞吐量。 而LinkedBlockingQueue内部则是基于锁,并提供了BlockingQueue的等待性方法。java.util.concurrent包提供的容器从命名上可...原创 2019-04-03 23:57:19 · 254 阅读 · 0 评论 -
Java核心技术15 | 一个线程两次调用start
Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常,多次调用start()被认为是编程错误。关于线程生命周期的不同状态,在Java 5以后,线程状态被明确定义在java.lang.Thread.State中,分别是:NEW:表示线程被创建出来还没真正启动的状态,可以认为是一个Java内部状态; RUNNABLE...原创 2019-03-30 14:40:31 · 407 阅读 · 0 评论 -
Java核心技术19 | 并发库中的线程池
通常都是利用Executors提供的通用线程池创建方法,去创建不同配置的线程池,主要区别在于不同的ExecutorService类型或者不同的初始参数。Executors目前提供了5种不同的线程池创建配置:newCachedThreadPool(),它是用来处理大量短时间工作任务的线程池,具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;如果线程闲置时间超...原创 2019-04-04 19:41:15 · 190 阅读 · 0 评论 -
Java核心技术16 | Java程序会产生死锁的情况
死锁定义:死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。死锁不仅仅是在线程之间会发生,存在资源独占的进程之间同样也可能出现死锁。通常来说,我们大多是聚焦在多线程场景中的死锁,指两个或多个线程之间,由于互相持有对方需要的锁,而永久处于阻塞的状态。死锁实例:public class DeadLockSample extends ...原创 2019-04-01 20:10:10 · 1244 阅读 · 1 评论 -
Java核心技术13 | ReentrantLock和Synchronized的区别
线程安全概念:保证多线程环境下共享的,可修改的状态的正确性。即如果状态不是共享的,或是不可修改的,也就不存在线程安全问题。保证线程安全的两个方法:封装:通过封装,将对象内部状态隐藏起来,保护起来。 不可变:final和immutable对象。线程安全需要保证几个基本特性:原子性:相关操作不会中途被其他线程干扰,一般通过同步机制实现。 可见性:一个线程修改了某个共享变量,其状...原创 2019-03-28 14:51:12 · 137 阅读 · 0 评论 -
Java核心技术17 | Java提供的并发工具类
Java 并发包提供了哪些并发工具类?我们通常所说的并发包也就是 java.util.concurrent 及其子包,集中了 Java 并发的各种基础工具类,具体主要包括几个方面:提供了比 synchronized 更加高级的各种同步结构,包括CountDownLatch、CyclicBarrier、Sempahore 等,可以实现更加丰富的多线程操作,比如利用Semaphore 作为资源...原创 2019-04-01 21:46:36 · 199 阅读 · 0 评论 -
Effective Java第三章:对于所有对象都通用的方法
1、覆盖equals时请遵守通用约定覆盖equals方法看似很简单,但是有许多覆盖方法会导致错误,避免这些错误最直接的方法就是不覆盖equals方法,这种情况下,类的每个实例都只与它自身相等。1、不需要覆盖equals方法的情况有哪些?类的每一个实体本质上都是唯一的。比如Thread类,每一个实体都是唯一的,所以不需要覆盖equals方法。 不关心类是否提供了“逻辑相等”的测试功能。...原创 2019-05-08 21:21:19 · 194 阅读 · 0 评论 -
PriorityQueue
Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度,将让读者建立对PriorityQueue建立清晰而深入的认识。总体介绍前面以JavaArrayDeque为例讲解了Stack和Queue,其实还有一种特殊的队列叫做PriorityQueue...转载 2019-03-22 15:25:31 · 79 阅读 · 0 评论 -
Java核心技术08 | 容器
Vector、ArrayList、LinkedList1 底层实现方式ArrayList内部用动态数组来实现;LinkedList内部采用双向链表实现;Vector内部用动态数组实现(线程安全)。 ArrayList和Vector内部使用对象数组来保存数据,当数组满时,Vector扩容时会提高1倍,ArrayList则是增加50%。2 读写机制ArrayList在执行插入元素是...原创 2019-03-22 14:07:36 · 124 阅读 · 0 评论 -
Java核心技术12 | 接口和抽象类
典型定义接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的。接口,不能实例化;不能包含任何非常量成员,任何 field 都是隐含着 public static final 的意义;同时,没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。Java 标准类库中,定义了非常多的接口,比如 java.util.List。抽象类是不能实例化的类,用 ab...原创 2019-03-25 14:37:54 · 376 阅读 · 0 评论 -
ArrayList
1.基本简介ArrayList是一个数组队列,相当于动态数组,与java中的数组相比,它的容量能动态增长,它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。Arr...原创 2018-12-03 12:53:13 · 115 阅读 · 0 评论 -
LinkedList
LinkedList概念与简单实例LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用.1:LinkedList提供了4个不同位置的添加数据的方法,分别为链头插入,链尾插入,节点前插入,节点后插入2:由于LinkedList是双向链表,在查询数据方面提供了“从前往后”和“从后往前”两个查询方法3:如果数据量大,删除频繁,只能用LinkedList。特别...原创 2018-12-03 12:53:29 · 154 阅读 · 0 评论 -
ArrayList中modCount的作用
这个成员变量记录着集合的修改次数,即每次add或者remove他的值都会加1.Iterator的源码:public Iterator<E> iterator(){ return new Itr();}返回的是一个Itr对象,这个Itr是ArrayList的内部类private class Itr implements Iterator<E> { ...原创 2018-12-03 12:53:47 · 271 阅读 · 0 评论 -
HashMap
1、简介数组链表本质是Entry[] 数组一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry,这些个Entry分散存储在一个数组当中,这个数组就是HashMap的主干。HashMap数组每一个元素的初始值都是null2、构造函数HashMap():构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。HashMap(i...原创 2018-12-03 13:34:27 · 117 阅读 · 0 评论 -
Java核心技术01 | 对java的理解
Java本身是一种面向对象的语言,最显著的特性有两个:一是所谓的“书写一次,到处运行”(Write once, run anywhere),能够非常容易地获得跨平台能力。另外就是"垃圾收集"(GC,Garbage Collection),Java通过垃圾收集器回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。Java特性:面向对象(封装,继承,多态)平台无关性(JVM运...原创 2019-03-09 15:34:47 · 236 阅读 · 0 评论 -
Java核心技术05 | String、StringBuffer、StringBuilder
1、StringString的创建机理由于String在Java世界中使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池。其运行机制是:创建一个字符串时,首先检查池中是否有值相同的字符串对象,如果有则不需要创建直接从池中刚查找到的对象引用;如果没有则新建字符串对象,返回对象引用,并且将新创建的对象放入池中。但是,通过new方法创建的String对象是不检...原创 2019-03-14 13:43:15 · 111 阅读 · 0 评论 -
Java核心技术02 | Exception和Error的区别
Exception和Error都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出或者捕获,它是异常处理机制的基本组成类型。Exception和Error体现了Java平台设计者对不同异常情况的分类,Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。Error是指在正常情况下,不大可能出现的情况,绝大部分的Er...原创 2019-03-10 14:02:53 · 103 阅读 · 0 评论 -
Java核心技术03 | final、finally、 finalize的不同
基本定义final可以用来修饰类、方法、变量,分别有不同的意义,final修饰的class代表不可以继承扩展,final的变量是不可以修改的,而final的方法也是不可以重写的。 finally则是java保证重点代码一定要被执行的一种机制,我们可以使用try-finally或者try-catch-finally来进行类似关闭JDBC连接、保证unlock锁等动作。 finalize是基础...原创 2019-03-10 16:35:21 · 120 阅读 · 0 评论 -
Java核心技术04 | Java引用类型
在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用;Java中根据其生命周期的长短,将引用分为4类。不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响。1、强引用(StrongReference)特点:我们平常典型编码Object obj = new Object()中的obj就是强引用,就是我们最常见的普通对象引用,通过关键字new创...原创 2019-03-11 23:31:59 · 158 阅读 · 0 评论 -
Java核心技术06 | 动态代理
典型定义反射机制是Java语言提供的一种基础功能,赋予程序在运行时自省(introspect)的能力。通过反射我们可以直接操作类或对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。 动态代理是一种方便运行时动态构造代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装RPC调用、面向切面的编程(AOP)。 实现动...原创 2019-03-14 21:56:29 · 123 阅读 · 0 评论 -
Java核心技术07 | int和Integer的区别
Java语言虽然号称一切都是对象,但原始数据类型是例外。关于自动拆箱和装箱我们都知道 int 和 Integer 可以自动相互转换,这是 Java 给我们提供的一种语法糖,语法糖可以简单理解为Java平台为我们自动进行了一些转换,保证不同的写法在运行时等价,它们发生在编译阶段,也就是生成的字节码是一致的。Integer integer = 1;int unboxing = inte...原创 2019-03-14 23:15:49 · 149 阅读 · 0 评论 -
Java核心技术11 | Java IO
典型定义Java IO方式有很多种,基于不同的 IO 抽象模型和交互方式,可以进行简单区分。首先,传统的 java.io 包,它基于流模型实现,提供了我们最熟知的一些 IO 功能,比如 File 抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。java.io 包的好处是代...原创 2019-03-25 11:31:48 · 4057 阅读 · 0 评论 -
Effective Java第二章:创建和销毁对象
1、考虑使用静态工厂方法代替构造器静态工厂方法与构造器不同的第一大优势在于,他们有名称。一个类只能有一个带有指定签名的构造器,避开这一限制的方法是通过提供多个构造器,参数列表在参数类型的顺序上有所不同,但这样很容易导致调用错误的构造器。由于静态工厂方法有名称,不受上述限制。因此当一个类需要多个带有相同签名的构造器时,就用静态工厂方法代替构造器,并且慎重地选择名称以便突出它们之间的区别。 静态...原创 2019-05-07 22:43:50 · 163 阅读 · 0 评论