并发编程
文章平均质量分 67
JAVA并发编程
keeper42
Just do one thing and do it well! 要么别做,要做就做到最好!
展开
-
【并发编程】并发安全性
类的线程安全定义 如果多线程下使用这个类,不过多线程如何使用和调度这个类,这个类总是表示出正确的行为,这个类就是线程安全的。 类的线程安全表现为: 操作的原子性 内存的可见性 不做正确的同步,在多个线程之间共享状态的时候,就会出现线程不安全。 怎么才能做到类的线程安全? 栈封闭 所有的变量都是在方法内部声明的,这些变量都处于栈封闭状态。 无状态 没有任何成员变量的类,就叫无状态的类 让类不可变 让状态不可变,两种方式: 1,加final关键字,对于一个类,所有的成员变量应该是私有.原创 2022-02-14 08:55:48 · 98 阅读 · 0 评论 -
【并发编程】线程池工作机制及其类型
JDK中的线程池和工作机制 线程池的创建 ThreadPoolExecutor,jdk所有线程池实现的父类 各个参数含义 int corePoolSize :线程池中核心线程数,< corePoolSize ,就会创建新线程,= corePoolSize ,这个任务就会保存到BlockingQueue,如果调用prestartAllCoreThreads()方法就会一次性的启动corePoolSize 个数的线程。 int maximumPoolSize, 允许的最大线程数,Bl...原创 2022-02-14 07:20:34 · 130 阅读 · 0 评论 -
【并发编程】同步容器、并发容器、阻塞队列、双端队列与工作密取...
1、同步容器 主要代表有Vector和Hashtable,以及Collections.synchronizedXxx等。 锁的粒度为当前对象整体。 迭代器是及时失败的,即在迭代的过程中发现被修改,就会抛出ConcurrentModificationException。 2、并发容器 主要代表有ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentSkipListMap、ConcurrentSkipListSet 锁的粒度是分散的、细粒度的,即读和写是使原创 2022-02-13 16:31:32 · 99 阅读 · 0 评论 -
【并发编程】一致性hash
考虑到分布式系统每个节点都有可能失效,并且新的节点很可能动态的增加进来,如何保证当系统的节点数目发生变化时仍然能够对外提供良好的服务,这是值得考虑的,尤其实在设计分布式缓存系统时,如果某台服务器失效,对于整个系统来说如果不采用合适的算法来保证一致性,那么缓存于系统中的所有数据都可能会失效(即由于系统节点数目变少,客户端在请求某一对象时需要重新计算其hash值(通常与系统中的节点数目有关),由于hash值已经改变,所以很可能找不到保存该对象的服务器节点),因此一致性hash就显得至关重要,良好...原创 2022-02-13 16:04:53 · 81 阅读 · 0 评论 -
【并发编程】跳表与阻塞队列
跳表 SkipList,以空间换时间,在原链表的基础上形成多层索引,但是某个节点在插入时,是否成为索引,概率决定,所以跳表又称为概率数据结构。 ConcurrentLinkedQueue 无界非阻塞队列,底层是个链表,遵循先进先出原则。 add,offer将元素插入到尾部,peek(拿头部的数据,但是不移除)和poll(拿头部的数据,但是移除) 写时复制容器 写时复制的容器,通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的原创 2022-02-13 16:01:23 · 98 阅读 · 0 评论 -
【并发编程】JDK1.8 HashMap
一、与1.7相比的重大变化 取消了segment数组,直接用table保存数据,锁的粒度更小,减少并发冲突的概率。 存储数据时采用了链表+红黑树的形式,纯链表的形式时间复杂度为O(n),红黑树则为O(logn),性能提升很大。什么时候链表转红黑树?当key值相等的元素形成的链表中元素个数超过8个的时候。 二、主要数据结构和关键变量 Node类存放实际的key和value值。 sizeCtl: 负数:表示进行初始化或者扩容,-1表示正在初始化,-N,表示有N-1个线程正在进行扩容 正数:0 表原创 2022-02-13 15:55:30 · 96 阅读 · 0 评论 -
【并发编程】JDK1.7 HashMap的原理和实现
JDK1.7 HashMap的原理和实现原创 2022-02-13 15:16:21 · 772 阅读 · 4 评论 -
【并发编程】ConcurrentHashMap与常见面试题
ConcurrentHashMap 数组+链表+红黑树 cas+synchronize 加锁方式保证线程安全 链表与红黑树之间的转换,它们之间的阈值?(6or8) 线程用步长隔开,进行扩容操作(并发扩容) HashMap常见面试题汇总 HashMap和HashTable有什么区别? Java中的另-个线程安全的与HashMap极其类似的类是什么?同样是线程安全,屿HashTable在线程 同步上有什么不同? HashMap & ConcurrentHashMap的区别? 为什么C原创 2022-02-13 15:13:54 · 317 阅读 · 0 评论 -
【并发编程】显式锁和AQS
独占锁 可重入锁 平时业务工作,读多写少、读写分离 读写锁 读线程->读锁,读锁共享,不排斥读锁,但排斥写锁 写线程->写锁,写锁独占,读写互斥 Syn wait / notify Lock Condition await/signal 显式锁 Lock接口和核心方法 Lock接口和synchronized的比较 synchronized 代码简洁,Lock:获取锁可以被中断,超时获取锁,尝试获取锁,读多写少用读写锁 可重入锁ReentrantLock、所谓锁的公原创 2022-02-12 03:36:39 · 206 阅读 · 0 评论 -
【并发编程】线程间的协作
线程间协作 轮询:难以保证及时性,资源开销很大, 等待和通知 wait() 对象上的方法 notify/notifyAll 对象上的方法 等待和通知的标准范式 等待方: 获取对象的锁; 循环里判断条件是否满足,不满足调用wait方法, 条件满足执行业务逻辑 通知方来说 获取对象的锁; 改变条件 通知所有等待在对象的线程 notify和notifyAll应该用谁? 应该尽量使用notifyAll,使用notify因为有可能发生信号丢失的的情况 等...原创 2022-02-10 04:12:33 · 66 阅读 · 0 评论 -
【并发编程】原子操作CAS
syn基于阻塞的锁的机制,1、被阻塞的线程优先级很高,2、拿到锁的线程一直不释放锁怎么办?3、大量的竞争,消耗cpu,同时带来死锁或者其他安全。 原子操作:不可分割的操作 CAS(compare and swap,乐观锁,无锁化编程) CAS的原理 CAS(Compare And Swap),指令级别保证这是一个原子操作 三个运算符: 一个内存地址V,一个期望的值A,一个新值B 基本思路:如果地址V上的值和期望的值A相等,就给地址V赋给新值B,如果不是,不做任何操作。 循环(死循环,.原创 2022-02-10 04:23:44 · 88 阅读 · 0 评论 -
【并发编程】线程的并发工具类
Fork-Join 分治算法(分而治之) 规模为N的问题,N<阈值,直接解决,N>阈值,将N分解为K个小规模子问题,子问题互相独立,与原问题形式相同,将子问题的解合并得到原问题的解 动态规范 工作密取 workStealing Fork/Join使用的标准范式 常用的并发工具类 CountDownLatch 作用:是一组线程等待其他的线程完成工作以后在执行,加强版join await用来等待(join),countDown负责计数器的减一 CyclicBar原创 2022-02-10 04:20:13 · 81 阅读 · 0 评论 -
【并发编程】线程基础与线程间的共享
java原创 2022-02-09 09:32:57 · 221 阅读 · 0 评论 -
【并发编程】Java 内存模型与线程
并发是计算机发展的成就。(并发,同一时段发生;并行,同一时刻发生) 我们知道,早期计算机只能串行的进行运行(最古老的打孔)。而经过多年的发展,计算机可以“同时”做很多事情。但悲剧的是,因为CPU速度和其它设备之间的速度差别太大,比如磁盘IO、网络传输、数据库访问等等,如果不希望CPU在进行这些操作时一直处于等待的状态,就要充分压榨它的性能让它干别的事情。 目前在服务器端,衡量一个服务性能的高低好坏,每秒事务处理数(Transactions Per Second,TPS)是最重要的指标之一,它代表一秒内服转载 2021-01-28 16:55:17 · 186 阅读 · 0 评论