![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
文章平均质量分 90
冰魄秋雨
这个作者很懒,什么都没留下…
展开
-
lock死锁
这种情况就是一个死锁。线程 A 和 线程 B 获取资源的顺序要一样,当线程 A 是先尝试获取资源 A,然后尝试获取资源 B 的时候,线程 B 同样也是先尝试获取资源 A,然后尝试获取资源 B。比如下图,如果线程 A 已经持有的资源,不能再同时被线程 B 持有,如果线程 B 请求获取线程 A 已经占用的资源,那线程 B 只能等待,直到线程 A 释放了资源。比如,线程 A 已经持有资源 2,而想请求资源 1, 线程 B 已经获取了资源 1,而想请求资源 2,这就形成资源请求等待的环形图。(破坏不可剥夺条件)原创 2024-06-24 10:59:03 · 967 阅读 · 0 评论 -
lock-锁的概念
锁是计算机协调多个进程或线程并发访问某一资源的机制(避免发生资源争抢)在并发环境下,多个线程会对同一个资源进行争抢,可能会导致数据不一致的问题。为了解决这一问题,需要通过一种抽象的锁来对资源进行锁定,锁就是对共有的资源进行了保护,保证程序在并发场景下有条不紊的,安全性的运行。锁通常需要硬件支持才能有效实施。这种支持通常采取一个或多个原子指令的形式,如"test-and-set", “fetch-and-add” or “compare这些指令允许单个进程测试锁是否空闲,如果空闲,则通过单个原子操作获取锁。原创 2024-06-20 17:25:01 · 848 阅读 · 0 评论 -
synchronized原理
当线程释放锁,JMM会把线程对应的本地的内存中的共享变量刷新到内存中当线程获取锁,JMM会帮其他线程中对应的本地的内存中的共享变量设置未无效,从而监视器保护的临界区的代码必须从内存中读取共享变量。(临界区为锁之间的代码)原创 2024-06-19 10:02:55 · 466 阅读 · 0 评论 -
volatile原理
volatile是java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。一方面volatile不会造成上下文切换的开销,另一方面它又不能像synchronized那样保证所有场景下线程安全,因此必须在合适的场景下使用volatile机制。在每个volatile写操作的后面插入一个StoreLoad屏障。在每个volatile读操作的后面插入一个LoadLoad屏障。在每个volatile读操作的后面插入一个LoadStore屏障。内存屏障解决了有序性。原创 2024-06-19 10:01:29 · 318 阅读 · 0 评论 -
JMM和底层实现原理
*Java 内存区域和 JMM 有何区别?**这是一个比较常见的问题,很多初学者非常容易搞混。Java 内存区域和内存模型是完全不一样的两个东西JVM 内存结构和 Java 虚拟机的运行时区域相关,定义了 JVM 在运行时如何分区存储程序数据,就比如说堆主要用于存放对象实例。原创 2024-06-18 10:22:37 · 393 阅读 · 0 评论 -
CPU多核并发和一致性MESI协议
的引入,导致 存储缓存写入缓存行和执行失效队列的时机需要十分合适才能尽可能释放CPU的处理能力,实际上CPU并不知道什么时候会执行,因此将这个任务留给了写程序的人,这就是我们常说的。是对方CPU还有没有将值的状态修改为无效,就读取返回。我们知道处理器的处理速度很快,内存处理速度远远赶不上处理器的处理速度,为了解决CPU处理速度和内存处理速度不对等的问题,我们引入了CPU Cache。内存屏障:是CPU或编译器对内存随机访问的操作的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行之后的操作。原创 2024-06-18 10:21:37 · 389 阅读 · 0 评论 -
并发编程目录
ThreadList里面循环从队列中去Runnable任务,并调用run方法。者模型,线程池是消费者,调用者是生产者。,一个已经跑起来的工作线程组T。线程池对象里维护一个阻塞。原创 2024-06-18 10:20:38 · 534 阅读 · 0 评论