高并发
文章平均质量分 74
优化搬运工
这个作者很懒,什么都没留下…
展开
-
java多线程---Batch多线程统计问题
java多线程—统计汇总的问题文章目录java多线程---统计汇总的问题1. 问题描述2. 问题解决方式2.0 瑕疵方法2.1 使用synchronized修饰count2.2 ReentrantLock版本2.3 加上CountDownLatch2.4 Future方法3. 总结1. 问题描述在现实开发中,为了考虑性能问题,我们可以把大量的数据拆分成不同的Batch进行批处理,这边使用到了ExecutorService.submit()的线程池处理方法。那么问题也来了,到底怎么对数据进行汇总可以满原创 2021-07-03 12:29:37 · 851 阅读 · 1 评论 -
Java并发笔记 (16)------ Executor
文章目录Executor 框架介绍1. 两级调度模型2. Executor框架3. Executor成员1. FixedThreadPool在这里插入图片描述2.SingleThreadExecutor3. CachedThreadPool4. ScheduledThreadPoolExecutorExecutor 框架介绍1. 两级调度模型由上面这张图片可以看出:上层:Java多线程程序通常把应用分解为若干个任务,Executor框架)将这些任务映射为固定数量的线程底层:操作系统内核将这些线原创 2020-05-28 17:46:34 · 356 阅读 · 0 评论 -
Java并发笔记 (15)------ Java 线程池
文章目录Java 线程池1. 实现原理2. 线程池使用3. 向线程池提交任务4. 关闭线程池Java 线程池使用线程池的好处:降低资源消耗:重复利用已创建的线程提高响应速度:不需要线程创建的时间提高线程的管理性:通过线程池,可以对线程进行同意分配调度1. 实现原理线程池处理流程如下图所示:过程描述:线程池判断核心线程池里的线程是否都在执行任务 过程 1如果不是,则创建一个新的工作线程来执行任务。如果不是,则进入下个流程。线程池判断工作队列是否已经满。过程 2如果阻原创 2020-05-24 21:27:47 · 150 阅读 · 0 评论 -
Java并发笔记 (15)------ 并发工具类
文章目录1. CountDownLatch2. 同步屏障 CyclicBarrier1.简介2. 应用场景3. Semaphore1. CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。可以等价于下面的代码:public class joinCountDown { public static void main(String[] args) throws InterruptedException { Thread parser1原创 2020-05-23 14:11:11 · 165 阅读 · 0 评论 -
Java并发笔记 (14)------ 阻塞队列
文章目录阻塞队列1.简述2. Java的阻塞队列2.1 ArrayBlockingQueue(FIFO,有界)2.2 LinkedBlockingQueue(FIFO,有界)2.3 PriorityBlockingQueue(优先队列)2.4 DelayQueue(无界)2.5 SynchronousQueue(FIFO)2.6 LinkedBlockingDeque3. 实现原理阻塞队列1.简述阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方原创 2020-05-22 22:16:12 · 170 阅读 · 0 评论 -
Java并发笔记 (13)------ java 高并发容器
文章目录Java并发容器一、ConcurrentHashMap为什么要用ConcurrentHashMap?1. HashMap的线程不安全2. HashTable 效率低下源码分析1.我们先看一下`jdk1.6`结构图及分析:2. jdk 1.8二、 ConcurrentLinkedQueue结构分析源码分析Java并发容器吐槽一下:面试前真要准备好源代码分析,看源码真的是一种享受!一、ConcurrentHashMap为什么要用ConcurrentHashMap?1. HashMap的线程不安原创 2020-05-18 22:25:46 · 341 阅读 · 0 评论 -
Java并发笔记 (12)--- Condition与LockSupport 剖析
文章目录Condition1. Condition接口与示例2. Condition的实现方式1. 等待队列2. 等待3. 通知补充:LockSupportCondition任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()以及notifyAll()方法,这些方法与synchronized同步关键字配合,以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与L原创 2020-05-15 13:04:12 · 362 阅读 · 0 评论 -
Java并发笔记 (11)--- 读写锁
文章目录1. 接口2. 源码层次分析读写锁1. 读写状态的设计2. 写锁的获取与释放3. 读锁的获取与释放4. 锁降级1. 接口ReadWriteLock 定义了读锁与写锁的两个方法,readLock()和writeLock()方法,其实现为ReentrantReadWriteLockpublic class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializable我们看一下ReadWriteLock原创 2020-05-14 17:44:01 · 408 阅读 · 1 评论 -
Java并发笔记 (10)---- ReentrantLock
文章目录重入锁(ReentrantLock)1. 实现重新进入2. 公平与非公平获取锁的区别重入锁(ReentrantLock)就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁的还支持获取锁时的公平和非公平性选择。ReentrantLock虽然没能像synchronized关键字一样支持隐式的重进入,但是在调用lock()方法时,已经获取到锁的线程,能够再次调用 lock() 方法获取锁而不被阻塞。下面将着重分析ReentrantLock是如何实现重进入和公平性获取锁原创 2020-05-11 22:25:15 · 132 阅读 · 0 评论 -
AQS源码分析 ---- 2
文章目录3)共享式同步状态获取与释放4) 独占式超时获取同步状态3)共享式同步状态获取与释放与独占式获取最主要的区别:能否有多个线程同时获取到同步状态上图,左半边表示共享式访问数据,后边为独占式访问数据。通过调用同步器的acquireShared(int arg)方法可以共享式地获取同步状态public final void acquireShared(int arg) { if (tryAcquireShared(arg) < 0) doAcquireShared原创 2020-05-09 22:38:59 · 142 阅读 · 0 评论 -
AQS源码分析 ---- 1
1) 同步队列同步器依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成为一个节点(Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。下面直接呈上源代码!!!字多看的头疼同步队列中的节点(Node):static final class No...原创 2020-05-03 22:35:32 · 181 阅读 · 0 评论 -
Java并发笔记 (9)---- AQS示例
文章目录队列同步器的接口与示例队列同步器 AbstractQueuedSynchronizer(以下简称A.Q.S),是用来构建锁或者其他同步组件的基础框架。同步器是实现锁(也可以是任意同步组件)的关键锁是面向使用者的,它定义了使用者与锁交互的接口同步器面向的是锁的实现者,它简化了锁的实现方式队列同步器的接口与示例同步器的设计是基于模板方法模式的重写同步器指定的方法时,需要使用...原创 2020-05-03 22:30:55 · 439 阅读 · 0 评论 -
Java并发笔记 (8)---- Lock
锁锁是用来控制多个线程访问共享资源的方式。在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能。区别:缺少了(synchronized)隐式获取释放锁的便捷性。拥有了锁获取与释放的可操作性、可中断的获取锁以及超时...原创 2020-05-03 21:05:41 · 128 阅读 · 0 评论 -
Java并发笔记 (7)---volatile/sychronized
1. volatile和synchronized关键字volatile 可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性。synchronized可以修饰方法或者以同步块的形式来进行使用,它保证了线程对变量访问的可见性和排他性。我们对如下代码进行反编译public class S...原创 2020-05-01 20:28:39 · 188 阅读 · 0 评论 -
Java并发笔记 (6)---- 线程基础
文章目录1. 构造线程2.启动线程3.中断4.安全地终止线程1. 构造线程这里先放上Thread.java 中 init()的源代码private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc, ...原创 2020-04-30 22:29:36 · 96 阅读 · 0 评论 -
Java并发笔记 (5)
此处介绍的是线程的基础,下一个将介绍线程的终止与启动原创 2020-04-30 13:05:51 · 96 阅读 · 0 评论 -
volatile 内存语义
volatile 内存语义1. volatile 的特性volatile变量的单个读/写,可以看成是使用同一个锁对这些单个读/写操作做了同步volatile long val = 0L; // 使用volatile声明64位的long型变量public void set(long l) { val = l; // 单个volatile变量的写}public void getAn...原创 2020-04-25 23:33:40 · 123 阅读 · 0 评论 -
happens-before 解析
happens-before这里直接从讲述 happens-before 的定义及规则1.定义A happens-before B,A 的执行结果将对 B 操作可见,而且 A 的执行顺序排在 B 之前。A, B 存在happens-before关系,并不意味着Java平台的具体实现必须要按照happens-before关系指定的顺序来执行。(如果重排序之后的执行结果,与按happens-...原创 2020-04-24 22:29:11 · 151 阅读 · 0 评论 -
Java并发笔记 (4)---- 重排序
重排序重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。1 数据依赖分为三种类型名称代码示例写后读a = 1;b = a;写后写a = 1;a = 2;读后写a = b;b = 1重排序上面两个操作的执行顺序,程序的执行结果就会被改变。**注意:**不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑!!...原创 2020-04-24 21:51:14 · 123 阅读 · 0 评论 -
Java并发笔记 (3) ---- 原子操作
原子操作的实现原理原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。在多处理器上实现原子操作就变得有点复杂。让我们一起来聊一聊在Intel处理器和Java里是如何实现原子操作的。1 如何实现原子操作使用总线锁保证原子性举个栗子:如果i=1,我们进行两次 i++ 操作,我们期望的结果是3,但是有可...原创 2020-04-23 23:30:23 · 169 阅读 · 0 评论 -
Java并发笔记 (2)--- 偏向/轻量级/重量级 锁
1. 对象头synchronized 用的锁是存在Java对象头里的。长度内容说明32 bit/ 64 bitMark word存储对象的hashcode或锁信息等32 bit/ 64 bitClass Metadata Address存储到对象类型的指针32 bit/ 64 bitArray length数组长度(如果对象为数组)Java...原创 2020-04-23 22:50:46 · 164 阅读 · 0 评论 -
Java并发笔记 (1)
Java并发机制的底层实现原理(part 1)术语英文单词属于描述内存屏障memory barrier实现内存操作的顺序限制缓冲行cache line缓存中可以分配的最小存储单元原子操作atomic operations不可中断的一个或者一系列操作缓存行填充cache line fill当处理器识别到内存中读取操作数是可缓存的,处理器读取缓...原创 2020-04-22 23:31:29 · 91 阅读 · 0 评论