阻塞队列与线程池

阻塞队列 概念 队列 队列就可以想成是一个数组,从一头进入,一头出去,排队买饭 阻塞队列 BlockingQueue 阻塞队列,排队拥堵,首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如下图所示: 线程1往阻塞队列中添加元素,而线程2从阻塞队列中移除元素 当阻塞队列是空时,...

阅读更多

ConcurrentHashMap源码分析

多线程下的 HashMap 存在的问题 HashMap 在多线程下是不安全的。但是,在JDK1.8 的 HashMap 改为采用尾插法,已经不存在死循环的问题了,为什么也会线程不安全呢?我们以 put 方法为例(1.8): 假如现在有两个线程都执行到了下图的红色箭头处。当线程一判断为空之后,CPU 时间片到了...

阅读更多

从ReentrantLock的实现看AQS的原理

自己实现一个锁 方法一:通过自旋实现一个锁 public class SpinLock { //原子引用线程 AtomicReference<Thread> atomicReference = new AtomicReference<>(); public v...

阅读更多

Java锁

Java锁之公平锁和非公平锁 概念 公平锁 是指多个线程按照申请锁的顺序来获取锁,类似于排队买饭,先来后到,先来先服务,就是公平的,也就是队列 非公平锁 是指多个线程获取锁的顺序,并不是按照申请锁的顺序,有可能申请的线程比先申请的线程优先获取锁,在高并发环境下,有可能造成优先级翻转,或者饥饿的线程(也就...

阅读更多

谈谈Volatile

JUC简介 JUC(java.util.concurrent) 进程和线程 进程:后台运行的程序(我们打开的一个软件,就是进程) 线程:轻量级的进程,并且一个进程包含多个线程(同在一个软件内,同时运行窗口,就是线程) ...

阅读更多

AQS

可重入锁和递归锁ReentrantLock 概念 可重入锁就是递归锁 指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取到该锁的代码,在同一线程在外层方法获取锁的时候,在进入内层方法会自动获取锁(前提:锁对象得是同一个对象) 也就是说:线程可以进入任何一个它已经拥有的锁所同步的代码块 Reentr...

阅读更多

ArrayList源码解析

ArrayList的常见问题 ArrayList是什么,可以用来干嘛? ArrayList就是数组列表,主要用来装载数据,当我们装载的是基本类型的数据int,long,boolean,short,byte…的时候我们只能存储他们对应的包装类,它的主要底层实现是数组Object[] elementDat...

阅读更多

Spring常见面试题

Spring里用了哪些设计模式? 单例模式:Spring 中的 Bean 默认情况下都是单例的。无需多说。 工厂模式:工厂模式主要是通过 BeanFactory 和 ApplicationContext 来生产 Bean 对象。 代理模式:最常见的 AOP 的实现方式就是通过代理来实现,Spring主要是使...

阅读更多