![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
基础
文章平均质量分 67
chenfangya_93
这个作者很懒,什么都没留下…
展开
-
单例模式,枚举实现方式
private int age; private String name; public int getAge() { return age; } public Student() { super(); System.out.println("线程 " + Thread.currentThread().getName() + " 初始化" + this.getClass()...原创 2019-12-27 17:01:30 · 238 阅读 · 1 评论 -
多线程基础
格式混乱。。。。可至我的有道云查看:http://note.youdao.com/noteshare?id=277d8d512f6f80f111bc7a058aa3cb27&sub=743EACECE382418AAEEE56CA086E5CD1同步(Synchronous)和异步(Asynchronous)同步和异步通常用来形容一次方法调用。同步方法调用一旦开始,调用者必须等到方法调...原创 2018-12-07 15:54:19 · 170 阅读 · 0 评论 -
java8时间日期API(LocalDate、 LocalTime、 Instant、 Duration 以及 Period)
创建一个LocalDate对象并读取其值LocalDate date = LocalDate.of(2014, 3, 18);int year = date.getYear();Month month = date.getMonth();int day = date.getDayOfMonth();DayOfWeek dow = date.getDayOfWeek();int...原创 2018-11-05 17:19:50 · 2058 阅读 · 0 评论 -
Java8 Lambdas及函数式接口的例子& Optional类的方法
使用案例Lambda 的例子对应的函数式接口布尔表达式(List list) -> list.isEmpty()Predicate<List<>>创建对象() -> new Apple(10)Supplier&a原创 2018-10-09 17:32:19 · 201 阅读 · 0 评论 -
volatile 关键字
内存可见性由于 Java 内存模型(JMM)规定,所有的变量都存放在主内存中,而每个线程都有着自己的工作内存(高速缓存)。线程在工作时,需要将主内存中的数据拷贝到工作内存中。这样对数据的任何操作都是基于工作内存(效率提高),并且不能直接操作主内存以及其他线程工作内存中的数据,之后再将更新之后的数据刷新到主内存中。这里所提到的主内存可以简单认为是堆内存,而工作内存则可以认为是栈内存。如下图所...原创 2018-10-09 14:11:21 · 108 阅读 · 0 评论 -
类加载机制
双亲委派模型模型如下图:双亲委派模型中除了启动类加载器之外其余都需要有自己的父类加载器当一个类收到了类加载请求时: 自己不会首先加载,而是委派给父加载器进行加载,每个层次的加载器都是这样。所以最终每个加载请求都会经过启动类加载器。只有当父类加载返回不能加载时子加载器才会进行加载。双亲委派的好处 : 由于每个类加载都会经过最顶层的启动类加载器,比如 java.lang.Object这样的...原创 2018-10-09 13:44:48 · 99 阅读 · 0 评论 -
ConcurrentHashMap 实现原理
由于 HashMap 是一个线程不安全的容器,主要体现在容量大于总量*负载因子发生扩容时会出现环形链表从而导致死循环。因此需要支持线程安全的并发容器 ConcurrentHashMap 。JDK1.7 实现数据结构 如图所示,是由 Segment 数组、HashEntry 数组组成,和 HashMap 一样,仍然是数组加链表组成。ConcurrentHashMap 采用了分段锁技术,其...原创 2018-10-09 11:26:55 · 457 阅读 · 0 评论 -
Java 多线程三大核心
原子性Java 的原子性就和数据库事务的原子性差不多,一个操作中要么全部执行成功或者失败。JMM 只是保证了基本的原子性,但类似于 i++ 之类的操作,看似是原子操作,其实里面涉及到:获取 i 的值。自增。再赋值给 i。这三步操作,所以想要实现 i++ 这样的原子操作就需要用到 synchronized 或者是 lock 进行加锁处理。如果是基础类的自增操作可以使用 Atomic...原创 2018-10-09 09:31:17 · 125 阅读 · 0 评论 -
i++ 或者 ++i 是线程安全的吗。
不论是++i还是i++都不是原子操作,在运行中都可能会有CPU调度产生,造成i的值被修改,造成脏读脏写。volatile不能解决这个线程安全问题。因为volatile只能保证可见性,不能保证原子性。可以用锁。使用synchronized或者ReentrantLock都可以解决这个问题,一般使用synchronized更好,因为JVM团队一直以来都在优先改进这个机制,可以尽早获得更好...原创 2018-10-08 14:13:32 · 1429 阅读 · 3 评论 -
LinkedHashMap 底层分析
众所周知 HashMap 是一个无序的 Map,因为每次根据 key 的 hashcode 映射到 Entry 数组上,所以遍历出来的顺序并不是写入的顺序。因此 JDK 推出一个基于 HashMap 但具有顺序的 LinkedHashMap 来解决有排序需求的场景。它的底层是继承于 HashMap 实现的,由一个双向链表所构成。LinkedHashMap 的排序方式有两种:根据写入顺序排...原创 2018-10-08 13:44:50 · 94 阅读 · 0 评论 -
HashSet 底层分析
HashSet 是一个不允许存储重复元素的集合,它的实现比较简单,只要理解了 HashMap,HashSet 就水到渠成了。成员变量 private transient HashMap<E,Object> map; // Dummy value to associate with an Object in the backing Map private stati...原创 2018-10-08 13:38:21 · 172 阅读 · 0 评论 -
HashMap 底层分析
以下基于 JDK1.7 分析。如图所示,HashMap 底层是基于数组和链表实现的。其中有两个重要的参数:容量负载因子容量的默认大小是 16,负载因子是 0.75,当 HashMap 的 size > 16*0.75 时就会发生扩容(容量和负载因子都可以自由调整)。put 方法首先会将传入的 Key 做 hash 运算计算出 hashcode,然后根据数组长度取模计算出在数...原创 2018-10-08 11:49:30 · 109 阅读 · 0 评论 -
LinkedList 底层分析
如图所示 LinkedList 底层是基于双向链表实现的,也是实现了 List 接口,所以也拥有 List 的一些特点(JDK1.7/8 之后取消了循环,修改为双向链表)。新增方法public boolean add(E e) { linkLast(e); return true; } /** * Links e as last e...原创 2018-10-08 11:44:11 · 151 阅读 · 0 评论 -
ArrayList/Vector 的底层分析
ArrayListArrayList 实现于 List、RandomAccess 接口。可以插入空数据,也支持随机访问。ArrayList相当于动态数据,其中最重要的两个属性分别是: elementData 数组,以及 size 大小。在调用 add() 方法的时候:public boolean add(E e) { ensureCapacityInternal(size ...原创 2018-10-08 11:28:21 · 92 阅读 · 0 评论 -
MySQL利用延迟关联或者子查询优化超多分页场景(MySQL offset)
MySQL 分页并不是跳过 offset 行,而是取 offset +N 行,然后返回放弃前 offset 行,返回N 行,所以当 offset 特别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过特定阈值的页数进行 SQL 改写。例:SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b ...原创 2018-09-27 14:47:36 · 1449 阅读 · 1 评论 -
Java8 Lambda、方法引用和stream流示例
public class Apple { private String color; private Double weight; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public Double getWei...原创 2018-10-23 11:38:10 · 508 阅读 · 0 评论 -
Integer == 和 equals 的区别
当装包对象在IntegerCache.low到Integer.high之间时,结果直接从IntegerCache中获取,否则直接创造一个实例。源码如下:/** * Returns an {@code Integer} instance representing the specified * {@code int} value. If a new {@code Intege...原创 2018-09-25 14:30:09 · 363 阅读 · 0 评论 -
三元运算符 报错 java.lang.NullPointerException
@Setter@Getter@ToStringpublic class Student { private Integer age; private Integer year; }public static void main(String[] args) { Student stu = new Student(); stu.setAge(1); stu.setYe...原创 2018-09-25 14:53:54 · 617 阅读 · 0 评论