摘要:场景:当任务很多,成千上万个,或者单个任务很大,执行起来很耗时间,这时,就可以把任务进行拆分,拆分成多个小任务去执行,然后小任务执行完毕后再把每个小任务执行的结果合并起来,这样就可以节省时间。 ForkJoinPool实现了ExecutorService接口,所以它也是一种线程池,做的工作就是,把一
阅读全文
摘要:(Queue API详解) Queue API的几种方法的使用 方法名称 作用 描述 add 添加元素到队列 如果队列满了就抛异常java.lang.IllegalStateException remove 移除并且返回队列头部元素 如果队列为null,就抛异常java.util.NoSuchEle
阅读全文
摘要:(set源码解析) HashSet源码解析 HashSet简单使用的demo public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("中国"); set.add("你好"); set.a
阅读全文
摘要:本篇文章主要是学习后的知识记录,存在不足,或许不够深入,还请谅解。 ArrayList源码解析 ArrayList中的变量 通过上图可以看到,ArrayList中总共有7个变量,下面看下每个变量的作用: /** * 序列化 */ private static final long serialVer
阅读全文
摘要:本篇内容是学习的记录,可能会有所不足。 一:JDK1.7中的HashMap JDK1.7的hashMap是由数组 + 链表组成 /** 1 << 4,表示1,左移4位,变成10000,即16,以二进制形式运行,效率更高 * 默认的hashMap数组长度 * The default initial c
阅读全文
摘要:之前写了一下synchronized关键字的一点东西,那么除了synchronized可以加锁外,JUC(java.util.concurrent)提供的Lock接口也可以实现加锁解锁的功能。 看完本文,希望您可以了解或者掌握: 1:Lock接口的实现 2:Condition的原理和概念 3:Ree
阅读全文
摘要:一:几种锁的概念 1.1 自旋锁 自旋锁,当一个线程去获取锁时,如果发现锁已经被其他线程获取,就一直循环等待,然后不断的判断是否能够获取到锁,一直到获取到锁后才会退出循环。 1.2 乐观锁 乐观锁,是假设不会发生冲突,当去修改值的时候才判断是否和自己获得的值是一样的(CAS的实现,值也可以是版本号)
阅读全文
摘要:一:Runnable和Callable的区别 最本质的区别在于,Runnable没有返回结果,Callable会有一个返回结果,返回结果是泛型,可以自己定义。举例子说明: public class ThreadRunnable { public static void main(String[] a
阅读全文
摘要:一:stop终止线程 举例子: public class ThreadStop { public static int i; public static int j; public static void main(String[] args) throws InterruptedException
阅读全文
摘要:一:非原子性的原因 先举个栗子: public class ThreadCount { volatile int a = 0; public void add() { a++; } } 点击并拖拽以移动 public static void main(String[] args) throws In
阅读全文
摘要:线程之间需要进行通信,通信有数据共享和线程协作两种方式,这篇主要说线程协作的内容。 一:数据共享 1:文件共享;2:网络共享;3:变量共享。 二:线程协作 先来个场景:落魄程序员摆摊卖起了炒粉,起先有人去买炒粉,发现炒粉卖完了,只能失落的回家了;后来为了不让客户白来一趟,落魄程序员想到了一个办法,线
阅读全文
摘要:一:final的处理 1.1 经final修饰的变量或者对象,在其构造函数中初始化之后,其他线程一定可以获得正确的构造版本,即可以获得变量或者对象字段的最新值。 看下面的代码: public class ThreadFinal1 { public final int i; public int j;
阅读全文
摘要:一:不可见的原因 上一部分,根据代码可以知道,产生不可见的原因有两点: 1:CPU高速缓存会造成极短时间内数据的不可见 2:指令重排是导致不可见的主要原因 二:Java内存模型(JMM) java内存模型主要是描述多线程程序的语义,多个线程对数据进行了修改,该读取哪个的问题;Java内存模型并没有规
阅读全文
摘要:一:举个栗子 先举个例子: public class ThreadVolidate { public static int i = 0; public static Boolean flag = true; public static void main(String[] args) throws
阅读全文
摘要:本文主要介绍线程池的概念,原理,以及简单实现一个线程池,若文中有不足或错误之处,请指出(ps:感激涕零,不要让我陷入错误的误区。。。) 一:线程池的基本概念和原理 在此之前,先来思考一个问题,为啥要用线程池呢? 线程越多,不一定就会执行的越快,受到CPU的影响,我们要控制线程的数量,线程池它的一
阅读全文