JUC
去吧!小火龙
不积跬步,无以至千里!
展开
-
多线程-死锁排查
死锁排查什么是死锁死锁代码编写package com.coding.lock;import java.util.concurrent.TimeUnit;public class DeadLockDemo { public static void main(String[] args) { String lockA = "lockA"...原创 2020-03-11 17:37:38 · 164 阅读 · 0 评论 -
原子引用
原子引用赋值操作不是线程安全的。若想不用锁来实现,可以用AtomicReference<V>这个类,实现对象引用的原子更新。什么是ABA问题:狸猫换太子T1 100 1 (主操作:小明) A B AT2 100 1 = > 1 100 => 100 (其他人的操作:小花)原子类来解决(通过原子引用)通过增加一个版本号来解决,和乐观锁一模...原创 2020-03-11 17:16:20 · 377 阅读 · 0 评论 -
CAS
一、CAS(compareAndSwap)的概念CAS,全称Compare And Swap(比较与交换),解决多线程并行情况下使用锁造成性能损耗的一种机制。二、CAS(compareAndSwap)的产生 为什么需要CAS机制呢?我们先从一个错误现象谈起。我们经常使用volatile关键字修饰某一个变量,表明这个变量是全局共享的一个变量,同时具有了可见性和有序性。但是却没有原子性。比...原创 2020-03-11 16:46:36 · 150 阅读 · 0 评论 -
五种单例模式
单例模式一、概述单例模式的定义就是确保某一个类只有一个实例,并且提供一个全局访问点。属于设计模式三大类中的创建型模式。 单例模式具有典型的三个特点: 只有一个实例。 自我实例化。 提供全局访问点。 二、优缺点 优点:由于单例模式只生成了一个实例,所以能够节约系统资源,减少性能开销,提高系统效率,同时也能够严格控制客户对它的访问。 缺点:也...原创 2020-03-10 22:32:21 · 135 阅读 · 0 评论 -
多线程-Volatile
Volatile概念凡是加了Volatile的变量,其变量可以保证可见性,有序性,但不保证原子性可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。 可见性,是指线程之间的可见性,一个线程修改的状...原创 2020-03-09 21:34:46 · 126 阅读 · 0 评论 -
JMM(java Memory Model)java内存模型
JMM(java Memory Model)java内存模型概念:在不同的硬件生产商和不同的操作系统下,内存的访问逻辑有一定的差异,结果就是当你的代码在某个系统环境下运行良好,并且线程安全,但是换了个系统就出现各种问题。Java内存模型,就是为了屏蔽系统和硬件的差异,让一套代码在不同平台下能到达相同的访问结果。JVM在设计时候考虑到,如果JAVA线程每次读取和写入变量都直接操作主内...原创 2020-03-09 20:48:01 · 139 阅读 · 0 评论 -
多线程-常用辅助类
1.常用辅助类在多线程开发时有很多辅助类,今天我们选JUC包下的三个常用辅助类作一下说明。CountDownLatch(1)概念countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就...原创 2020-03-09 16:41:55 · 102 阅读 · 0 评论 -
Future
1.Future在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承thread类还是实现runnable接口,都无法保证获取到之前的执行结果。通过实现Callback接口,并用Future可以来接收多线程的执行结果。Future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback以便在任务执行成功或失败后作出相应的操作。 pu...原创 2020-03-07 16:36:47 · 135 阅读 · 0 评论 -
分支合并-forkjoin
1.分支合并-forkjoinForkJoin的框架的基本思想是分而治之。什么是分而治之?分而治之就是将一个复杂的计算,按照设定的阈值进行分解成多个计算,然后将各个计算结果进行汇总。相应的ForkJoin将复杂的计算当做一个任务。而分解的多个计算则是当做一个子任务。Fork/Join与传统线程池的区别!Fork/Join采用“工作窃取模式”,当执行新的任务时他可以将其拆分成...原创 2020-03-07 16:12:05 · 193 阅读 · 0 评论 -
Stream流
Stream 流Stream(流)是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, ma...原创 2020-03-06 21:47:07 · 119 阅读 · 0 评论 -
四大函数式接口
1.四大函数式接口消费型接口:Consumer<T>只有一个输入参数并且无返回值;使用:public class Demo { public static void main(String[] args) { Data data = new Data(); data.consumer(); ...原创 2020-03-06 21:08:34 · 124 阅读 · 0 评论 -
多线程-线程池
1.线程池池化技术池化技术能够减少资源对象的创建次数,提高程序的性能,特别是在高并发下这种提高更加明显。使用池化技术缓存的资源对象有如下共同特点:1,对象创建时间长;2,对象创建需要大量资源;3,对象创建后可被重复使用。一个资源池具备如下功能:租用资源对象、归还资源对象、清除过期资源对象,接下来我们就从这几个功能点出发分别进行分析。应用:线程池、连接池、内存池、对象...原创 2020-03-06 16:34:52 · 77 阅读 · 0 评论 -
多线程-阻塞队列
1.阻塞队列阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素阻塞队列...原创 2020-03-06 15:07:36 · 509 阅读 · 0 评论 -
多线程-读写锁
1.读写锁ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。 Java并发库中ReetrantReadWriteLock实现了ReadWriteLock接口并添加了可重入的特性假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线...原创 2020-03-05 17:06:43 · 904 阅读 · 0 评论 -
多线程下的集合
1.多线程集合的使用首先了解一下java普通的集合:Java集合主要由2大体系构成,分别是Collection体系和Map体系,其中Collection和Map分别是2大体系中的顶层接口。Collection主要有三个子接口,分别为List(列表)、Set(集)、Queue(队列)。其中,List、Queue中的元素有序可重复,而Set中的元素无序不可重复;List中主要有Ar...原创 2020-03-05 15:38:45 · 1657 阅读 · 0 评论 -
多线程-实例锁,类锁,与没有锁的情况
实例锁:对一个类的一个实例对象(对象A)进行加锁,防止其他线程同时访问对象A的synchronized块,但是对不同的此类的实例对象不做控制。实例锁使用Synchronized关键字修饰。类锁:对一个类的所有实例对象进行加锁,限制多线程中该类的所有实例同时访问该类的synchronized块。类锁使用Static Synchronized关键字修饰。利用8道题,搞定锁这个概念!...原创 2020-03-03 15:38:09 · 204 阅读 · 0 评论 -
线程通信-生产者消费者问题
1、线程通信-生产者消费者问题生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态。然后等待消费者消费...原创 2020-03-02 22:15:29 · 166 阅读 · 0 评论 -
JUC编程-什么是JUC
1.什么是JUCJUC:java原生并发包还有一些常用工具类2.线程基础知识并发、并行并发:多个线程操作同一个资源,交替执行的过程!并行:多个线程同时执行!只有在多核CPU下才能完成!线程六种状态新建(new) ,运行(RUNNABLE),阻塞(BLOCKED),等待(WAITING),延迟等待(TIMED_WAITING),终止(TERMINATED...原创 2020-03-02 19:58:04 · 1402 阅读 · 1 评论