![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
文章平均质量分 83
weixin_39505091
这个作者很懒,什么都没留下…
展开
-
并发编程10 - 线程安全集合类
@TOC一. 线程安全集合类分类Hashtable 是 hashmap 的安全实现,Vector 是 List 的安全实现。SynchronizedMap 和 SynchronizedList 是将传进来的 Map 和 List 对象封装成SynchronizedMap 和 SynchronizedList 对象,内部采用的是类似于装饰器模式,将所有方法加上 synchronized 关键字重写。Blocking类大部分实现就锁,并提供阻塞方法;CopyOnWrite 是在写的时候复制一份来避免原创 2021-09-10 21:02:04 · 68 阅读 · 0 评论 -
并发编程9 - AQS
文章目录一. 饥饿现象二. 池大小一. 饥饿现象当线程数不够,所有线程都在死等其他线程执行完毕时的现象被称为饥饿现象。示例:创建了一个固定线程数的线程池,共有两个线程,处理的任务有 点菜、做菜、上菜。如果同时有两位客人来,两个线程同时都去处理点菜任务了,之后就没有线程处理做菜任务,导致两个线程都陷入了死等(future.get()):public class hungerTest { private static final Logger logger = LoggerFactory.get原创 2021-09-01 22:03:01 · 50 阅读 · 0 评论 -
并发编程8 - 线程池
文章目录一. 自定义线程池1. 组成2. 阻塞队列3. 线程池4. 拒绝策略二. JDK提供的线程池——ThreadPoolExecutor1. 线程池状态2. 构造方法3. 不同类型的线程池4. 提交任务方法5. 停止方法一. 自定义线程池1. 组成线程池(ThreadPool):消费者;阻塞队列(BlockingQueue):暂存任务main线程(main):生产者当任务产生时,如果任务数量小于线程池中的线程数,将使用线程执行。如果任务数量超过线程数时,多余的任务将存入阻塞队列。线程从队列原创 2021-08-19 22:06:16 · 109 阅读 · 0 评论 -
并发编程7 - 不可变对象及享元模式
文章目录一. 不可变对象一. 不可变对象不可变对象是线程安全的,因为没有线程能够修改它。通过 String 类发现不可变类有以下几个特征:私有变量为 final 的,保证只有在构造时才能给它赋值;类也被 final 修饰,保证子类不会破坏其线程安全性;保护性拷贝(复制一份新的副本避免共享)。...原创 2021-08-10 21:30:21 · 95 阅读 · 0 评论 -
并发编程6 - 无锁并发CAS 与 Volatile
文章目录一. Java内存模型1. 可见性问题2. Balking 模式3. 有序性问题4. double-checked locking 问题二. 共享模型之无锁1. CAS 与 Volatile2. 原子类一. Java内存模型即 JMM(Java Memory Model),它定义了主存、工作内存抽象概念。体现在原子性:保证指令不会受到线程上下文切换的影响;(Monitor)可见性:保证指令不会受到 cpu 缓存的影响;(volatile、Monitor)有序性:保证指令不会受到 cpu原创 2021-08-09 20:28:11 · 117 阅读 · 0 评论 -
并发编程5 - 设计模式之固定/交替执行线程
文章目录一. 固定顺序运行二. 交替运行1. wait/notify 实现一. 固定顺序运行同时启动的两个线程无法确定其运行顺序,可以通过 park/unpark 简单实现其固定顺序运行。public class StickTurnTest { private static final Logger logger = LoggerFactory.getLogger(StickTurnTest.class); public static void main(String[] args)原创 2021-07-29 20:31:32 · 61 阅读 · 0 评论 -
并发编程4 - 线程状态、死锁及ReentrantLock
文章目录一. park VS unpark1. 用法2. 原理简述二. 再述线程状态转换一. park VS unpark1. 用法用于使线程等待,属于 LockSupport 的静态方法,使线程进入 Wait 状态。与 Object 的 wait/notify 的区别:wait/notify 必须配合对象锁一起使用,而 pack/unpack 不必;park/unpark 能做到精准阻塞和唤醒某个线程,而notify只能随机唤醒一个线程,notifyAll是唤醒所有线程,不能做到精准通知;原创 2021-07-27 21:38:17 · 576 阅读 · 0 评论 -
并发编程3 - notify/park及同步异步模式
文章目录一. wait-notify1. 原理2. API示例3. sleep 与 wait4. 如何正确使用 wait二. 同步模式之保护性暂停1. 定义2. 实现3. 扩展 —— 在类之间管理多个GuardedObject对象三. 异步模式之生产者消费者1. 要点2. 实现一. wait-notify1. 原理wait、notify 是 Object 对象的方法。只有获得了对象锁后才能调用该方法。使用wait的场景是:当获得了锁但是还未满足线程执行条件时可以考虑使用 wait。当调用 wait原创 2021-07-24 20:44:58 · 163 阅读 · 0 评论 -
并发编程2 -线程安全问题及Synchronized
文章目录一. 线程安全问题1. 共享带来的问题2. synchronized 解决方案3. 变量的线程安全分析4. 转账线程实例二. Monitor概念1. 概念2. synchronized 优化一. 线程安全问题1. 共享带来的问题上下文切换使得指令(一行代码对应多条指令)交错,导致多线程访问共享资源出现线程安全问题:例:public class ThreadTest { static int counter = 0; public static void main(Strin原创 2021-07-12 18:46:35 · 141 阅读 · 0 评论 -
并发编程1 - 线程基础及其常见方法
文章目录一. 进程与线程1. 概念2. 并发与并行3. 线程的应用一. 进程与线程1. 概念进程:进程可以视为程序的一个实例。当一个程序被运行,从磁盘加载这个程序的代码至内存,就开启了一个进程。进程是资源分配的最小单位。线程:线程是调度的最小单位,一个进程内可以有多个线程。线程由一系列指令组成。二者对比:进程间相互独立,线程存在于进程内,是进程的一个子集;进程拥有共享的资源,如内存空间,供内部的线程共享;进程间通信较为复杂,不同计算机之间的进程通信需要通过网络和协议;线程通信较为简单原创 2021-06-09 20:59:13 · 58 阅读 · 0 评论