java
文章平均质量分 87
JavaWeb学起来
这个作者很懒,什么都没留下…
展开
-
java死锁编码及定位分析
如果线上出现死锁问题,我们应该怎样来定位和解决呢,首先我们先了解下什么是死锁,死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁,简单通俗的将,线程A持有A锁,它并尝试着获取B线程的锁B,而同时线程B持有B锁,它并尝试着获取A线程的锁A,就这样相互等待着,吃着碗里的望着锅里的,是不是很形象,我们下边撸一个死锁的代码,分析并解决,多...原创 2020-07-22 10:42:17 · 246 阅读 · 0 评论 -
聊聊java线程池的七大参数,四种拒绝策略,工作原理以及合理配置线程数
面试大厂,都会涉及到的一个题目,java线程池的工作原理以及参数,今天我们就来聊聊这个问题,在创建了线程池后,当有请求任务来之后,就会安排池中的线程去执行请求任务,近似理解为今日当值线程,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中...原创 2020-07-21 15:53:45 · 923 阅读 · 0 评论 -
为什么要用线程池它的优势以及如何使用,也是实现多线程的第四种方式
线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行,它的主要特点是,线程复用,控制最大并发数,管理线程。 第一,降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二,提高响应速度,当任务到达时,任务可以不需要的等到线程创建就能立即执行。 第三,提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅会消耗系统...原创 2020-07-18 10:58:53 · 525 阅读 · 0 评论 -
原来实现多线程还有第三种方式Callable
java面试中,面试官会问,实现多线程有几种方式,答:两种,继承Thread类,实现runnable接口,面试官:开门,左转,不送。开个玩笑,实现多线程只知道这两种方法是不行的,今天我们就来介绍下,实现多线程的第三种方式,Callable,它也是JUC包下的类,它的主要特点是带返回值,主要和FutureTask类合起来用,FutureTask,翻译成未来任务,是把比较耗费时间的处理重新开一个线程去执行,,接下来我们看一个demo,在main线程中,import java.util.concur...原创 2020-07-17 11:07:12 · 172 阅读 · 0 评论 -
volatile/CAS/atomicInteger/BlockQueue/线程交互/原子引用的生产消费者实例
这篇文章是对前几篇文章的一个总结,用我们学过的知识点(volatile/CAS/atomicInteger/BlockQueue/线程交互/原子引用)做一个生产者消费者的例子,看下边的代码,我们在main方法中,创建两个线程,来操作资源类,import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.TimeUnit;...原创 2020-07-14 14:10:27 · 173 阅读 · 0 评论 -
synchronized和Lock有什么区别,用新的lock有什么好处,举例说说
回答这个问题,我们要从五个方面说起原始组成synchronized是关键字属于jvm层面monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象只有在同步块或方法中才能调用wait/notify等方法)Lock是具体类(java.util.concurrent.locks.Lock)是api层面的锁使用方法synchronized不需要用户去手动释放锁,当synchronized代码执行完后系统会自动让线程释放对锁的...原创 2020-07-10 12:35:10 · 219 阅读 · 0 评论 -
SynchronousQueue又叫零库存阻塞队列
SynchronousQueue,阻塞队列的一种,单个元素的队列,没有容量,与其他阻塞队列不同,SynchronousQueue是一个不存储元素的阻塞队列,每一个put操作必须要等待一个take操作,否则不能继续添加元素,反之亦然,也可叫做零库存阻塞队列,来一个demo,更加深刻的理解。import java.util.concurrent.BlockingQueue;import java.util.concurrent.SynchronousQueue;import java.util...原创 2020-07-08 15:24:11 · 152 阅读 · 0 评论 -
谈谈阻塞队列以及阻塞队列四种方法类型
队列的数据结构大家并不陌生,先进先出,先到先得,ArrayBlockingQueue 是一个基于数组的有界阻塞队列,次队列按FIFO(先进先出)原则对元素进行排序LinkedBlockingQueue 是一个基于链表结构的阻塞队列,次队列按FIFO(先进先出)排序元素,吞吐量通常要高于ArrayBlockQueueSynchronousQuere是一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插...原创 2020-07-07 16:41:12 · 3024 阅读 · 0 评论 -
Semaphore使用过吗
Semaphore,信号灯,也叫信号量,主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制,大家想一个生活中的例子,我们开车去超市买东西的时候,首先要把车停到超市的停车场中,停车场的车位是有限的,假设停车场有3个停车位,来了6辆车,总会有3辆车先抢到,后面的3辆车等待前边的3辆车买完东西开走后,才可以进入停车场停车,也就是java中多个线程抢多份有限的资源import java.util.concurrent.Semaphore;import java.util....原创 2020-07-06 12:07:50 · 149 阅读 · 0 评论 -
CyclicBarrier做加法CountDownLatch做减法
CyclicBarrier的字面意思是可循环(Cyclic)使用的屏障,它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await方法。举一个生活的例子,正常情况下,我们平时工作中开会,只有等人到齐后,会议才可以开始,我们来一个demo。import java.util.concurrent.BrokenBarrierException;import j...原创 2020-07-05 10:28:31 · 208 阅读 · 0 评论 -
原来CountDownLatch是用于线程间的调度
学一个类,或者一个方法,我们就从先从它的字面意思说起,CountDownLatch,倒计时,大家都看过发射火箭的最后阶段吧,10,9,8...,0发射,原创 2020-07-04 09:46:04 · 146 阅读 · 0 评论 -
java的独占锁(写锁),共享锁(读锁)和互斥锁以及ReentrantReadWriteLock用法
java中的锁有15种之多,但是有很多都是重复的,大的方面分为读锁和写锁,那今天我们就聊聊独占锁(写锁),共享锁(读锁)和互斥锁,独占锁呢,指该锁一次只能被一个线程所持有,对synchronized和ReentrantLock而言都是独占锁,那共享锁呢,指该锁可被多个线程所持有,对ReentrantReadWriteLock而言,其读锁是共享锁,其写锁是独占锁,读锁的共享可保证并发读是非常高效的,读写,写读,写写的过程是互斥的,多个线程同时读一个资源类没有任何问题,但是在这个高并发,大数据的互联网时...原创 2020-07-01 17:13:43 · 513 阅读 · 0 评论 -
聊聊java的自旋锁以及手撸一个自旋锁
前几天的一篇文章,谈到UnSafe类CAS思想时,说的其原理就是自旋锁(spinlock),那什么是自旋锁呢,从字面解释就是自我旋转,是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点就是循环会消耗CPU,下边这段代码是UnSafe的实现CAS的源码,使用do...while实现了一个自旋锁,循环着获取主内存中的值。 public final int getAndAddInt(Object o, long offset, int ...原创 2020-07-01 12:50:16 · 241 阅读 · 0 评论 -
java锁之公平,非公平锁,可重入锁(递归锁)
什么是java的公平锁呢,就是很公平,在并发环境中,每个线程在获取锁时会先看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个就占有锁,负责就会加入到等待队列中,以后会按照FIFO的规则从队列中取到自己,是指多个线程按照申请锁的顺序来获取锁,类似排队打饭,先来后到,非公平锁呢,是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁,在高并发的情况下,有可能会造成优先级反转或者饥饿现象,非公并锁比较粗鲁,上来就直接尝试占有锁,如果并发包中Reentrant...原创 2020-06-30 13:18:35 · 170 阅读 · 0 评论 -
集合类不安全之并发修改异常以及怎样解决
我们先通过一段代码来看看什么是并发修改异常import java.util.ArrayList;import java.util.List;import java.util.UUID;public class ContainerNoSafeDemo { public static void main(String[] args) { List<String> lists = new ArrayList<>(); // ...原创 2020-06-29 13:27:48 · 449 阅读 · 0 评论 -
CAS是什么它的优缺点以及怎样解决ABA问题
什么是CAS呢,它的全称是Compare And Swap,比较并交换,它是一条CPU并发原语,它的功能是判断内存中某个位置的值是否为预期值,如果是预期值则更改为新的值,这个过程是原子的,说到CAS,不得不说JUC包下的原子类,我们先来看一个demo。import java.util.concurrent.atomic.AtomicInteger;public class CASDemo { public static void main(String[] args) { ...原创 2020-06-24 14:23:30 · 1175 阅读 · 0 评论 -
对volatile的理解以及代码演示
volatile是java虚拟机提供的轻量级的同步机制原创 2020-06-21 16:59:22 · 274 阅读 · 0 评论