随笔分类 -  并发编程

摘要:为什么使用线程池? 线程是稀缺资源,不能频繁的创建。 解耦作用;线程的创建与执行完全分开,方便维护。 应当将其放入一个池子中,可以给其他任务进行复用。 线程池原理 核心的思想就是把宝贵的资源放到一个池子中;每次使用都从里面获取,用完之后又放回池子供其他人使用。 如何配置线程 在 JDK 1.5 之后 阅读全文
posted @ 2019-08-29 14:15 Emyin 阅读(182) 评论(0) 推荐(0)
摘要:普通的集合 List\Set\Map,并发的环境下,遍历的过程中不容许更新操作(增删改) 并发集合 非阻塞式集合(Non-Blocking Collection) ConcurrentLinkedDeque 这类集合也包括添加和移除数据的方法。如果方法不能立即被执行,则返回null或抛出异常,但是调 阅读全文
posted @ 2019-08-29 11:08 Emyin 阅读(218) 评论(0) 推荐(0)
摘要:概念 AQS是AbstactQueuedSynchronizer的简称,它是一个Java提供的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,例如ReentrantLock,Countd 阅读全文
posted @ 2019-08-29 09:27 Emyin 阅读(200) 评论(0) 推荐(0)
摘要:1. 使用上的区别 Volatile只能修饰变量,synchronized只能修饰方法和语句块 2. 对原子性的保证 synchronized可以保证原子性,Volatile不能保证原子性 3. 对可见性的保证 都可以保证可见性,但实现原理不同 Volatile对变量加了lock,synchroni 阅读全文
posted @ 2019-08-28 22:38 Emyin 阅读(209) 评论(0) 推荐(0)
摘要:synchronized锁什么? 锁对象,可能包括:this, 临界资源对象,class类对象 锁的底层实现 同步代码块基于monitor enter和monitor exit指令实现同步, 同步方法基于读取运行时常量池中方法的ACC_SYNCHRONIZED标志来隐式实现。 对象内存的组成 对象头 阅读全文
posted @ 2019-08-28 15:25 Emyin 阅读(189) 评论(0) 推荐(0)
摘要:1. 基本概念 程序:静态,用于完成某些功能的代码。 进程:动态,运行中的程序 线程:进程中的实际运作单位,一个进程可以包含一个或多个线程。 2. JVM内存区域 堆:线程共享,存放实例对象 (OOM) 虚拟机栈 :线程私有 ,Java方法在运行时的内存模型 (OOM),存放局部变量、引用类型数据的 阅读全文
posted @ 2019-08-25 21:07 Emyin 阅读(145) 评论(0) 推荐(0)
摘要:ThreadLocal不能保证其创建的对象是全局唯一,但能保证在单个线程中是唯一的。 示例: 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 ThreadLocal是如 阅读全文
posted @ 2019-01-25 17:50 Emyin 阅读(137) 评论(0) 推荐(0)
摘要:Aop是什么 与OOP对比,面向切面,传统的OOP开发中的代码逻辑是自上而下的,而这些过程会产生一些横切性问题,这些横切性的问题和我们的住业务逻辑关系不大,这些横切性问题不会影响到主逻辑实现的,但是会散落到代码的各个部分,难以维护。AOP是处理一些横切性问题,AOP的编程思想就是把这些问题和主业务逻 阅读全文
posted @ 2017-11-19 00:56 Emyin 阅读(480) 评论(0) 推荐(0)
摘要:ConcurrentHashMap是J.U.C包里面提供的一个线程安全并且高效的HashMap,所以ConcurrentHashMap在并发编程的场景中使用的频率比较高,那么这一节课我们就从ConcurrentHashMap的使用上以及源码层面来分析ConcurrentHashMap到底是如何实现安 阅读全文
posted @ 2017-04-21 19:06 Emyin 阅读(171) 评论(0) 推荐(0)
摘要:CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续工作。CyclicBarrier默认的构造方法是CyclicBarrier 阅读全文
posted @ 2017-03-30 21:26 Emyin 阅读(338) 评论(0) 推荐(0)
摘要:semaphore也就是我们常说的信号灯,semaphore可以控制同时访问的线程个数,通过acquire获取一个许可,如果没有就等待,通过release释放一个许可。有点类似限流的作用。叫信号灯的原因也和他的用处有关,比如某商场就5个停车位,每个停车位只能停一辆车,如果这个时候来了10辆车,必须要 阅读全文
posted @ 2017-03-29 19:56 Emyin 阅读(1663) 评论(0) 推荐(0)
摘要:countdownlatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完毕再执行。从命名可以解读到countdown是倒数的意思,类似于我们倒计时的概念。 countdownlatch提供了两个方法,一个是countDown,一个是await,countdownlatch 阅读全文
posted @ 2017-03-20 11:32 Emyin 阅读(422) 评论(1) 推荐(0)
摘要:Condition是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒 condition中两个最重要的方法,一个是await,一个是signal方法 await:把当前线程阻塞挂起 signal:唤醒阻塞的线程 示例: 线程awaitT 阅读全文
posted @ 2017-03-19 22:09 Emyin 阅读(163) 评论(0) 推荐(0)
摘要:J.U.C简介 Java.util.concurrent是在并发编程中比较常用的工具类,里面包含很多用来在并发场景中使用的组件。比如线程池、阻塞队列、计时器、同步器、并发集合等等。 Lock Lock在J.U.C中是最核心的组件,前面我们讲synchronized的时候说过,锁最重要的特性就是解决并 阅读全文
posted @ 2017-03-19 11:38 Emyin 阅读(285) 评论(0) 推荐(0)
摘要:volatile的作用 volatile可以使得在多处理器环境下保证了共享变量的可见性,那么到底什么是可见性呢?不知道大家有没有思考过这个问题 在单线程的环境下,如果向一个变量先写入一个值,然后在没有写干涉的情况下读取这个变量的值,那这个时候读取到的这个变量的值应该是之前写入的那个值。这本来是一个很 阅读全文
posted @ 2017-03-19 11:12 Emyin 阅读(939) 评论(0) 推荐(0)
摘要:示例: 运行结果: 997 如何保证线程并行的数据安全问题? 我们可以思考一下,问题的本质在于共享数据存在并发访问。如果我们能够有一种方法使得线程的并行变成串行,那是不是就不存在这个问题呢? 按照大家已有的知识,最先想到的应该就是锁吧。 synchronized的基本认识 在多线程并发编程中sync 阅读全文
posted @ 2017-03-19 10:59 Emyin 阅读(183) 评论(0) 推荐(0)
摘要:线程的实现方式 1. 继承Thread类创建线程 2. 实现Runnable接口创建线程 如果自己的类已经extends另一个类,就无法直接extends Thread,此时,可以实现一个Runnable接口 3. 实现Callable接口通过FutureTask包装器来创建Thread线程 有的时 阅读全文
posted @ 2017-03-18 22:59 Emyin 阅读(186) 评论(0) 推荐(0)
摘要:一.内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起 阅读全文
posted @ 2016-07-17 16:44 Emyin 阅读(431) 评论(0) 推荐(0)