- 博客(10)
- 收藏
- 关注
原创 可重入锁 ReentrantLock AQS 源码解析
使用范例Lock lock = new ReentrantLock();lock.lock();try { dosomething();} finally { lock.unlock();}在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放。接口结构Lock是个顶级接口,构建了锁的生态环境void lock();获取锁。如果该锁不可用,则出于线程调度目的,当前线程将被禁用,并处于休眠状态,直到获得该锁为止void lockInterru
2020-12-11 23:22:42 326 2
原创 JAVA 线程池ThreadPoolExecutor源码阅读与分析
线程池是什么提前创建好若干个线程,如果有任务需要处理,这些创建好的线程就会开始处理任务,处理完之后线程并不会被销毁而是被保存起来,而是等待下一个任务。为什么需要线程池创建和销毁线程都是消耗系统资源的。线程模型又分为用户线程,与内核线程。用户线程ULT用户程序实现的,不依赖系统核心,应用自己管控线程,不需要进行用户态/内核态的切换。操作系统内核无感知。内核线程KLT系统内核管控,内核保存上下文状态和信息,多处理器情况上能并发运行,线程的创建于同步由内核完成,能够调度CPU资源。一个小测试
2020-12-09 00:47:31 308 2
原创 循环依赖的解决
是什么循环依赖,也就是两个或者两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。如下图:代码中的体现@Componentpublic class A { // A中注入了B @Autowired private B b;}@Componentpublic class B { // B中也注入了A @Autowired private A a;}解决循环依赖的本质先去缓存Map里找Bean,没有则
2020-12-23 16:41:30 448
原创 FactoryBean的使用
FactoryBean的用法在某些情况下,实例化bean过程比较复杂,如果还是采用配置的方法,需要在中提供大量的配置信息,配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。Spring为此提供了一个FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化bean的逻辑。public interface FactoryBean<T> { T getObject() throws Exception; Class<?> get
2020-12-21 17:31:54 769 1
原创 ReentrantReadWriteLock 源码学习
是什么读写锁在同一时刻可以允许多个读线程访问,但是写线程操作时,所有的读线程和其他写线程均被阻塞。使用例子public class LockTest { private static ReadWriteLock lock = new ReentrantReadWriteLock(); /** * 读取资源 */ public void read() throws InterruptedException { lock.readLock().
2020-12-15 20:29:11 141
原创 volatile关键字 可见性 有序性 原子性 内存语义
理解volatile特性的一个好方法是把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步class VolatileFeaturesExample { volatile long vl = 0L; // 使用volatile声明64位的long型变量 public void set(long l) {...
2020-12-09 22:51:03 239
原创 JAVA retry 使用
简介retry不是关键字他是一个标记有点类似于goto,goto是Java中的保留字,在目前版本的Java中没有使用。retry后面跟循环,标记这个循环开始的位置。后续在continue或者break后面加retry。continue retry从这个标记的循环继续执行,不是重新开始,而是继续执行。break retry跳过这个标记的循环break retry 例子public static void main(String[] args) { retry: for
2020-12-07 19:00:06 148
原创 Java线程池简单使用学习
常用的五种类型线程池newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutornewScheduledThreadPoolnewWorkStealingPoolnewFixedThreadPool定长线程池,控制线程最大并发数,超出的任务会在队列中等待。public static void main(String[] args) { ExecutorService pool = Executors.newFixedTh
2020-12-07 16:34:21 193
原创 多线程学习之线程的创建与终止
线程的几种创建模式通过实现Runnable接口来创建Thread线程:public class Main { public static void main(String[] args) { MyThread task = new MyThread(); Thread thread = new Thread(task); thread.start(); } static class MyThread implements Runn
2020-12-06 16:44:18 215
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人