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