![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
文章平均质量分 62
ProMan_XY
这个作者很懒,什么都没留下…
展开
-
并发编程工具集——读写锁-ReadWriteLock(上篇)(十六)
快速实现一个缓存(用 ReadWriteLock 快速实现一个通用的缓存工具类。使用缓存首先要解决缓存数据的初始化问题。原创 2024-07-04 09:00:00 · 197 阅读 · 0 评论 -
并发编程工具集——限流器-Semaphore简述(十五)
Java SDK 里面提供了 Lock,为啥还要提供Semaphore。如何使用信号量(和可重入锁类似)原创 2024-07-04 08:30:00 · 445 阅读 · 0 评论 -
并发编程工具集——Lock和Condition(下)(十四)
当 RPC 结果返回时,会调用 doReceived() 方法,这个方法里面,调用 lock() 获取锁,在 finally 里面调用 unlock() 释放锁,获取锁后通过调用 signal() 来通知调用线程,结果已经返回,不用继续等待了。DefaultFuture 里面唤醒等待的线程,用的是 signal(),而不是 signalAll(),你来分析一下,这样做是否合理呢?,在 TCP 协议层面,发送完 RPC 请求后,线程是不会等待 RPC 的响应结果的。Dubbo帮我们做了异步转同步的事情,原创 2024-07-02 08:30:00 · 481 阅读 · 0 评论 -
并发编程工具集——Lock和Condition(中)(十三)
synchronized和Lock的区别。什么是可重入锁和可重入函数。原创 2024-07-02 08:15:00 · 252 阅读 · 0 评论 -
并发编程工具集——Lock和Condition(上)(十二)
Java SDK 里面的 ReentrantLock,内部持有一个 volatile 的成员变量 state,获取锁的时候,会读写 state 的值;volatile 变量规则:由于 state = 1 会先读取 state,所以线程 T1 的 unlock() 操作 Happens-Before 线程 T2 的 lock() 操作;传递性规则:线程 T1 的 value+=1 Happens-Before 线程 T2 的 lock() 操作。后续线程T2能够看到value的正确规则。原创 2024-06-28 09:00:00 · 550 阅读 · 0 评论 -
并发编程理论基础——面向对象与并发编程(十一)
有助于你写出“健壮”的并发程序的宏观原则。识别共享变量间的约束条件。原创 2024-06-28 08:30:00 · 282 阅读 · 0 评论 -
并发编程理论基础——合适的线程数量和安全的局部变量(十)
当你调用一个方法时,CPU 要先找到方法的地址,然后跳转到这个地址去执行代码,最后 CPU 执行完方法后返回。因为每个线程都有自己的调用栈,局部变量保存在线程各自的调用栈里面,不会共享,所以自然也就没有并发问题。注意:工作中都是按照逻辑核数来的,理论值和经验值仅供参考,实际上还是要靠压测。原创 2024-06-26 09:00:00 · 830 阅读 · 0 评论 -
并发编程理论基础——Java线程的生命周期(下)(九)
其中的 join() 是一种线程同步方法,例如有一个线程对象 thread A,当调用 A.join() 的时候,执行这条语句的线程会等待 thread A 执行完,而等待中的这个线程,其状态会从 RUNNABLE 转换到 WAITING。stop() 方法会真的杀死线程,如果线程持有 ReentrantLock 锁,被 stop() 的线程并不会自动调用 ReentrantLock 的 unlock() 去释放锁,那其他线程就再也没机会获得 ReentrantLock 锁。原创 2024-06-26 08:30:00 · 709 阅读 · 0 评论 -
并发编程理论基础——Java线程的生命周期(上)(八)
Java 语言里的线程本质上就是操作系统的线程,它们是一一对应的。这五种状态在不同编程语言里会有简化合并。原创 2024-06-24 09:00:00 · 410 阅读 · 0 评论 -
并发编程理论基础——管程(并发编程的万能钥匙)(七)
三个模型的区别:Hasen 模型、Hoare 模型和 MESA 模型的一个核心区别就是当条件满足后,如何通知相关线程。管程要求同一时刻只允许一个线程执行,那当线程 T2 的操作使线程 T1 等待的条件满足时,T1 和 T2 究竟谁可以执行呢?wait() 的正确姿势。原创 2024-06-24 08:45:00 · 376 阅读 · 0 评论 -
并发编程理论基础——安全性、活跃性以及性能问题【并发编程宏观角度来看会出现的问题】(六)
并发量:指的是能同时处理的请求数量,一般来说随着并发量的增加、延迟也会增加。所以延迟这个指标,一般都会是基于并发量来说的。例如并发量是 1000 的时候,延迟是 50 毫秒。性能问题(度量指标应该有一套完整的标准体系,过于空泛得不出好的性能方案,有些技术是好技术,但可能并不适用所有场景)吞吐量:指的是单位时间内能处理的请求数量。吞吐量越高,说明性能越好。延迟:指的是从发出请求到收到响应的时间。延迟越小,说明性能越好。原创 2024-06-18 09:00:00 · 560 阅读 · 0 评论 -
并发编程理论基础——解决死锁【等待-通知机制优化循环等待】(五)
我们再假设之后线程 1 归还了资源 AB,如果使用 notify() 来通知等待队列中的线程,有可能被通知的是线程 4,但线程 4 申请的是 CD,所以此时线程 4 还是会继续等待,而真正该唤醒的线程 3 就再也没有机会被唤醒了。下图中,左侧有一个等待队列,同一时刻只允许一个线程进入synchronized保护的临界区,当有一个线程进入临界区后,其他线程就只能进入左侧等待队列中(这个等待队列和互斥锁是一对一的关系,每个互斥锁都有自己独立的等待队列)(右侧的等待队列就是互斥锁的等待队列)原创 2024-06-18 08:45:00 · 415 阅读 · 0 评论 -
并发编程理论基础——死锁初阶(四)
使用细粒度锁可能会导致死锁如何产生死锁避免死锁(只要我们能够破坏上条的一个条件就可以成功避免)原创 2024-06-17 09:00:00 · 352 阅读 · 0 评论 -
并发编程理论基础——互斥锁初阶(三)
并不是不可分割,不可分割只存在于外在表现,本质是多个资源间有一致性的要求,操作的中间状态对外不可见;解决原子性问题,是要保证中间状态对外不可见。Synchronized(锁定对象是重点,这块儿应该和JVM串起来聊,毕竟底层JVM实现的很符合Java复杂逻辑体系)当修饰静态方法时,锁定的是当前类的 Class 对象。当修饰非静态方法时,锁定的是当前实例对象 this。修饰代码块时:锁住的是代码块中配置的对象。原创 2024-06-17 08:45:00 · 115 阅读 · 0 评论 -
并发编程理论基础——Java内存模型解决可见性和有序性问题(二)
通知编译器,对这个变量的读写,什么是 Java 内存模型。原创 2024-06-12 11:38:36 · 329 阅读 · 0 评论 -
并发编程理论基础——可见性、原子性和有序性问题(一)
可见性、原子性和有序性问题。原创 2024-06-12 11:35:08 · 194 阅读 · 0 评论