
并发编程
文章平均质量分 72
并发编程
zuodaoyong
这个作者很懒,什么都没留下…
展开
-
并发设计模式系列一 同步模式之保护性暂停
保护性暂停,用在一个线程等待另一个线程的执行结果。JDK 中,join 的实现、Future 的实现,采用的就是此模式。 class GuardedObject{ private final Object lock=new Object(); private Object response; public Object get() throws Exception{ synchronized (lock){ while (res.翻译 2021-12-12 15:38:33 · 126 阅读 · 0 评论 -
ThreadLocal
ThreadLocal用来提供线程内部的局部变量,这种变量在多线程环境下访问时能保证各个线程的变量相对独立于其他线程内的变量。不同线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量传递的复杂度。 ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程上下文。 一、ThreadLocal与synchronized的区别 synchronized ThreadLocal 原理 同步机制采用以翻译 2021-10-05 13:48:32 · 560 阅读 · 0 评论 -
ForkJoin
Fork/Join 是 JDK 1.7 加入的新的线程池实现,它体现的是一种分治思想,适用于能够进行任务拆分的 cpu 密集型运算。 所谓的任务拆分,是将一个大任务拆分为算法上相同的小任务,直至不能拆分可以直接求解。跟递归相关的一些计算,如归并排序、斐波那契数列、都可以用分治思想进行求解。 Fork/Join 在分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率,Fork/Join 默认会创建与 cpu 核心数大小相同的线程池 提交给 Fork/Join 线程池翻译 2021-08-08 23:22:08 · 180 阅读 · 0 评论 -
并发编程之自定义线程池简单实现
一、自定义拒绝策略 @FunctionalInterface public interface RejectPolicy<T> { void reject(BlockingQueue<T> queue, T task); } 二、自定义任务队列 class BlockingQueue<T> { //1. 任务队列 private Deque<T> queue = new ArrayDeque<T>();翻译 2021-07-29 00:03:39 · 105 阅读 · 0 评论 -
JMM内存模型
一、cpu的缓存模型 简化版 二、JMM内存模型 Java多线程内存模型跟cpu缓存模型类似,基于cpu缓存模型来建立的 1、数据原子操作 (1)read(读取) 从主内存读取数据 (2)load(载入) 将主内存读取到的数据写入工作内存 (3)use(使用) 从工作内存读取数据计算 (4)assign(赋值) 将计算好的值重新赋值到工作内存中 (5)store(存储) 将工作内存数据写入主内存 (6)write(写入) 将store过去的变量值赋值给主内存中的变翻译 2020-11-01 23:42:17 · 267 阅读 · 0 评论 -
synchronized 锁升级
一、轻量级锁 如果一个对象有多个线程访问,但是多线程访问的时间是错开的(没有竞争),那么可以使用轻量级锁来优化。 synchronized (this){ //todo } 当执行同步代码块时,会创建锁记录对象,每个线程的栈帧中包含一个锁记录的结构, 锁记录中Object reference指向锁对象,并尝试用cas替换Object的mark word,将mark word的值存入所记录。 1、加锁 (1)如果cas成功,对象头中存储了锁记录地址和状态00,表示由该线程给对象加锁。翻译 2020-07-16 13:43:19 · 368 阅读 · 0 评论 -
HashMap在jdk7的并发死链
https://www.cnblogs.com/wang-meng/p/7582532.html翻译 2020-07-04 23:15:30 · 533 阅读 · 0 评论 -
线程安全集合类
1、老版本线程安全集合类 HashTable,Vector 2、Collections装饰的线程安全集合 Collections.synchronizedCollection(); Collections.synchronizedList(); Collections.synchronizedMap(); Collections.synchronizedSet(); Collections.synchronizedNavigableMap(); Collections.synchronizedNav翻译 2020-07-04 22:15:45 · 216 阅读 · 0 评论 -
Atomic详解
举个例子,比如说10个线程分别对data执行一次data++操作,我们以为最后data的值会变成10,其实不是。因为多线程并发操作下,就是会有这种安全问题,导致数据结果不准确。 public class Test { private int data=0; //多个线程对一个data不停的累加1操作 } 针对并发问题,可以加锁(比如内置锁或者lock),还有一种方式是使用Atomic相应的类和方法保证在并发下数据的准确性 一、Atomic AtomicInteger ,AtomicB...翻译 2020-07-02 21:56:45 · 1131 阅读 · 0 评论 -
并发编程之线程池详解
juc线程池最重要的接口是ExecutorService,ThreadPoolExecutor类是线程池的具体实现 一、线程池状态 ThreadPoolExecutor中使用int的高3位来表示线程池的状态,低29位表示线程数量 状态名 高3位 接受新任务 处理阻塞队列任务 说明 Running 111 Y Y ShutDown 000 N Y 不会接受新任务,但是会处理阻塞队列的剩余任务 stop 00.翻译 2020-06-29 22:56:26 · 218 阅读 · 0 评论 -
Synchronized详解
一、先看一个简单的多线程例子 public class Test { static int count=0; public static void main(String[] args) throws InterruptedException { for(int i=0;i<100;i++){ new Thread(){ ...翻译 2020-04-16 22:21:13 · 303 阅读 · 0 评论 -
并发编程之ReentrantLock
在Java5.0之前,协调对共享对象的访问可以使用的机制只有synchronized和volatile。我们知道synchronized关键字实现了内置锁,而volatile关键字保证了多线程的内存可见性。 在大多数情况下,这些机制都能很好地完成工作,但却无法实现一些更高级的功能,例如,无法中断一个正在等待获取锁的线程,无法实现限定时间的获取锁机制,无法实现非阻塞结构的加锁规则等。而这些更灵活的...翻译 2020-02-09 11:07:30 · 158 阅读 · 0 评论 -
并发编程之AQS(AbstractQueuedSynchronizer)详解
ReentrantLock实现了一个内部类Sync,该内部类继承了AbstractQueuedSynchronizer,所有锁机制的实现都是依赖于Sync内部类,也可以说ReentrantLock的实现就是依赖于AbstractQueuedSynchronizer类。于此类似,CountDownLatch, CyclicBarrier, Semaphore这些类也是采用同样的方式来实现自己对于锁的...翻译 2020-02-08 20:03:41 · 257 阅读 · 0 评论 -
并发编程之常用操作(等待,通知,join,yeild,sleep)
1、等待(wait)和通知(notify) JDK提供了两个非常重要的方法:等待wait()方法和通知notify()方法。这2个方法并不是在Thread类中的,而是在Object类中定义的。这意味着所有的对象都可以调用者两个方法。 public final void wait() throws InterruptedException; public final native void n...翻译 2020-02-08 12:47:56 · 217 阅读 · 0 评论 -
并发编程之线程中断
在java中,线程中断是一种重要的线程写作机制,从表面上理解,中断就是让目标线程停止执行的意思,实际上并非完全如此。在上面中,我们已经详细讨论了stop方法停止线程的坏处,jdk中提供了更好的中断线程的方法。严格的说,线程中断并不会使线程立即退出,而是给线程发送一个通知,告知目标线程,有人希望你退出了!至于目标线程接收到通知之后如何处理,则完全由目标线程自己决定,这点很重要。 Thread提供了...翻译 2020-02-08 11:16:43 · 125 阅读 · 0 评论 -
并发编程之Java8如何优化CAS性能
举个例子,比如说10个线程分别对data执行一次data++操作,我们以为最后data的值会变成10,其实不是。因为多线程并发操作下,就是会有这种安全问题,导致数据结果不准确。 public class Test { private int data=0; //多个线程对一个data不停的累加1操作 } 这里解释下为啥会得不到10(知道的可直接跳过),i++这个操作,计算...翻译 2020-01-31 13:00:32 · 731 阅读 · 3 评论 -
ThreadPoolExecutor线程池中类的关系
顶级接口Executor只有一个方法execute 这里要区分Executor和Executors(Executor是线程的最底层接口,Executors是公共工厂方法) ExecutorService扩展了Executor的功能 AbstractExecutorService实现了ExecutorService功能 引入这次主题线程池的类:ThreadPoolEx...原创 2020-01-07 23:12:50 · 427 阅读 · 0 评论