
JUC并发编程
juc并发编程学习笔记
Gebo
经历的都是过往,现在的才是未来。
展开
-
公平锁、非公平锁、可重入锁、自旋锁,死锁及死锁排查
公平锁、非公平锁公平锁:非常公平,不能插队,必须先来后到!非公平锁:非常不公平,可以插队(默认都是非公平)//非公平锁public Reentrantlock(){ sync=new NonfairSync();}//公平锁public Reentrantlock(boolean fair){ sync=fair?new FairSync():new NonfairSync();}可重入锁Synchronized版public class Demo01 { p转载 2020-05-27 14:59:18 · 243 阅读 · 0 评论 -
深入理解CAS,解决ABA问题
CAS(campare and swap)public class CASDemo { // CAS compareAndSet : 比较并交换! public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInteger(2020); //期望、更新 //public final boolean compareAndSet(int expect,in转载 2020-05-27 14:55:38 · 249 阅读 · 0 评论 -
学习volatile:1. 保证可见性 2. 不保证原子性 3. 禁止指令重排
谈谈对volatile的理解volatile是Java虚拟机提供的轻量级同步机制保证可见性不保证原子性禁止指令重排保证可见性public class JMMDemo { // 不加 volatile 程序就会死循环! // 加 volatile 可以保证可见性 private volatile static int num = 0; public static void main(String[] args) { // main .转载 2020-05-27 09:33:47 · 181 阅读 · 0 评论 -
Java内存模型JMM
什么是JMMJMM即为JAVA 内存模型(java memory model)。因为在不同的硬件生产商和不同的操作系统下,内存的访问逻辑有一定的差异,结果就是当你的代码在某个系统环境下运行良好,并且线程安全,但是换了个系统就出现各种问题。Java内存模型,就是为了屏蔽系统和硬件的差异,让一套代码在不同平台下能到达相同的访问结果。JMM从java 5开始的JSR-133发布后,已经成熟和完善起来。关于JMM的一些同步约定:1.线程解锁前,必须把共享变量立刻刷回主存(举个例子,如下图,线程A要拿到主存的原创 2020-05-27 08:21:20 · 202 阅读 · 0 评论 -
ForkJoin详解
什么是ForkJoin?ForkJoin在jdk1.7,在并行执行任务!提高效率,在处理大数据量时运用到。大数据:Map Reduce(把大任务拆成小任务,如下图:)ForkJoin特点:工作窃取什么是工作窃取,我们通过一个例子讲解一下,如下图,A,B是两个不同的线程,分别维护着两个不同的双端队列,当A线程执行到一半时,B线程已经执行完了,这时,B线程会把A线程处理的队列中把最后一个拿过来帮忙处理,提高效率,这种就叫做工作窃取。package com.kuang.forkjoin;imp转载 2020-05-20 22:54:03 · 4515 阅读 · 1 评论 -
Stream流式计算
什么是Stream流式计算Stream流式计算就是把计算交给流来操作,而集合只做存储。这么说可能看不懂,我们通过下面例子来理解。题目要求:一分钟内完成此题,只能用一行代码实现!现在有5个用户!筛选:1、ID 必须是偶数2、年龄必须大于23岁3、用户名转为大写字母4、用户名字母倒着排序5、只输出一个用户!代码实现:package com.kuang.stream;import java.util.Arrays;import java.util.List;public cla转载 2020-05-20 22:35:00 · 492 阅读 · 0 评论 -
四大函数式接口
什么是函数式接口只有一个方法的接口称为函数式是接口@FunctionalInterfacepublic interface Runnable{ public abstract void run();}//简化编程模型,在新版本的框架底层大量使用//foreach(消费者类的函数式接口)** Function 函数型接口**/** * Function 函数型接口, 有一个输入参数,有一个输出 * 只要是 函数型接口 可以 用 lambda表达式简化 */public cl转载 2020-05-20 19:07:33 · 286 阅读 · 0 评论 -
线程池:Executors工具类的三大方法和ThreadPoolExecutor的七大参数及四种拒绝策略
线程池需要掌握的知识点:三大方法、七大参数、四种拒绝策略讲线程池前,我们得先了解一下池化技术池化技术通俗讲就是我事先准备好一些资源,有人需要用就可以来我这里借去使用,用完后再还回来就可以了,这样还回来的资源又可以让后面需要来借的人拿去使用。线程池就是利用的池化技术,把多个线程维护在一个池子里,池子里面的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。这样做的好处是:1.可以降低资源的消耗;2. 提高响应的速度;3.提高线程的可管理性。(总结成一句话:线程复用、可控原创 2020-05-20 16:17:14 · 601 阅读 · 0 评论 -
阻塞队列BlockingQueue(add,offer,put,remove,poll,take,element,peek介绍)和同步队列SynchronizeQueue
BlockingQueueAPI文档中的描述BlockingQueue与Collection的关系四组API方式抛出异常有返回值,不抛异常阻塞 等待超时等待添加add()offer()put()offer(,)移除remove()poll()take()poll(,)检测队首元素element()peek()添加:add()只能添加队列的容量大小的元素,如果添加元素数量超过队列容量大小,则会IllegalStateExcept原创 2020-05-19 17:32:57 · 2843 阅读 · 0 评论 -
一文学懂读写锁ReadWriteLock
ReadWriteLock我们先来查看jdk1.8API文档里对ReadWriteLock的描述所有已知实现类: ReentrantReadWriteLockA ReadWriteLock维护一对关联的locks ,一个用于只读操作,一个用于写入。 read lock可以由多个阅读器线程同时进行,只要没有作者。 write lock是独家的。 (也就是我们说的一写多读)所有ReadWriteLock实现必须保证的存储器同步效应writeLock操作(如在指定Lock接口)也保持相对于所述相关联原创 2020-05-14 17:15:57 · 331 阅读 · 0 评论 -
必须要会的常用辅助类CountDownLatch、CyclicBarrier、Semaphore
CountDownLatchjdk1.8文档是这么介绍CountDownLatch的允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。A CountDownLatch用给定的计数初始化。 await方法阻塞,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await 调用立即返回。 这是一个一次性的现象 - 计数无法重置。 如果您需要重置计数的版本,请考虑使用CyclicBarrier 。A CountDownLatch原创 2020-05-14 09:32:29 · 255 阅读 · 0 评论 -
深扒HashMap和ConcurrentHashMap的源码
初识HashMapHashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。HashMap 的实现不是同步的,这意味着它不是线程安全的,多线程环境下用 ConcurrentHashMap 替代HashMap。它的key、value都可以为null。此外,HashMap中的映射不是有序的。HashMap在JDK1.7和JDK1.8中的区别在 JDK 1.7原创 2020-05-10 16:07:59 · 412 阅读 · 0 评论 -
如何使ArrayList和Set在多线程并发环境下线程安全
ArrayList是一个我们常见的集合类之一,我们平常使用的都是在单线程的情况下,那么,在多线程并发的情况下,ArrayList还能和单线程一样安全吗?我们可以试一下,代码走起。import java.util.ArrayList;import java.util.List;import java.util.UUID;public class ListTest { public static void main(String[] args) { List<Stri原创 2020-05-09 08:40:13 · 604 阅读 · 0 评论 -
八个例子彻底理解锁
例子一:一个对象,两个加锁方法下面代码运行结果是先输出打电话还是发短信public class Test1 { public static void main(String[] args) { Phone phone= new Phone(); //这里的->是lambda表达式的写法 new Thread(()-> { phone.sendMessage(); },"A").start().原创 2020-05-08 18:54:16 · 328 阅读 · 0 评论 -
面试高频-----生产者与消费者经典问题
synchronized版本package cn.gb.demo08;/** * 线程之间的通信问题:生产者和消费者问题! 等待唤醒,通知唤醒 * 线程交替执行 A B 操作 */public class A { public static void main(String[] args) { Data data=new Data(); //这...原创 2020-04-29 10:41:17 · 548 阅读 · 0 评论 -
深扒synchronized锁和lock锁
synchronized锁synchronized是Java的关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、D等)正在用这个方法,有的话要等正在使用synchronized方法的线程B(或者C、D)运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized方法和synchronized块。用...原创 2020-04-29 10:39:14 · 317 阅读 · 0 评论