java
文章平均质量分 72
Jake巨佬
Android开发
展开
-
ArrayDeque解析
ArrayDeque是一个双向队列,既可以实现栈,也能用作队列。内部通过数组来实现,能够同时在两端进行插入删除的操作,同时也是非线程安全的,如果在多线程中使用它,需要自己去处理同步操作,它不允许放入null元素。用作栈时,优于Stack,用作队列时,效率高于LinkedList.构造函数: public ArrayDeque() { //默认初始化一个长度为16的数组原创 2017-10-19 16:21:29 · 558 阅读 · 0 评论 -
volatile、final内存含义以及happen-before规则
volatile和final在线程同步时起到很大的作用,那么在Java内存中这两个关键字是如何和线程同步关联起来呢,以及线程的happen-before规则又是怎么定义的呢?volatile的内存含义volatile用来修饰变量,可以保证变量每次都是从主内存中读取,但是它不保证原子性,先来看看具体的例子:public class VolatileExample { private s...原创 2019-02-22 21:09:42 · 612 阅读 · 0 评论 -
双亲委派模型
从Java虚拟机的角度来看,类加载器只有两种:启动类加载器,由C++实现,作为虚拟机本身的一部分;其他类加载器,由Java实现,独立于虚拟机,且全部继承自抽象类java.lang.ClassLoader.从开发人员的角度来看,类加载器可以再细分一点:启动类加载器:负责加载JAVA_HOME/lib下的类库,或者通过-Xbootclasspath指定的路径,且只能够加载被虚拟机识别...原创 2019-04-18 11:02:23 · 120 阅读 · 0 评论 -
Java并发之CAS理解
CASCAS即compare and set,是可以保证线程安全的一种较为高效的方法,首先来看一下例子:int i = 0;public void increment(){ i++; //这里分为三步:1.读取i的值, 2. 对i进行+1操作 3.将+1后的i刷新回主内存} 这里如果有2个线程同时来调用这个方法,但是结果不一定是2,因为每个线程都有自己的工作内存,首先假设线程...原创 2019-04-19 12:10:13 · 236 阅读 · 0 评论 -
Java线程池
使用线程池的好处降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指掌。线程池的实现原理具体过程如图所示...原创 2019-04-19 20:40:23 · 700 阅读 · 0 评论 -
Java锁分类
Java中的单从名词上来听有很多种,例如乐观锁、悲观锁、轻量级锁等等,但是其实真正的锁实现无外乎就是Lock的实现类以及Synchronized,而这些锁大部分是根据不同的状态或者功能对锁进行的划分,从美团技术点评看到一篇比较好的文章,对于锁的划分很详细,原文链接:美团参考文档以下是参考该分类划分的锁概图:...原创 2019-04-20 10:24:27 · 637 阅读 · 0 评论 -
Java并发学习总结
可见性线程之间的可见性,一个线程修改的状态对另外的线程可见,即A线程改变了某个状态,B也能马上看到。用volatile修饰的变量就是可见的,不允许线程内部缓存和重排序,即直接修改内存,如果不是用volatile的话,不同的线程会先从主存中copy一个对象,放在CPU缓存中,导致不同的线程修改变量,其他的线程看不到,不过volatile它不保证原子性,例如: volatile int a = ...原创 2019-04-20 10:51:40 · 236 阅读 · 0 评论