
并发编程
文章平均质量分 61
请叫我黄同学
4年经验的java,在博客方面,是个新人,看到博客写的不好方面,多多指教,会把自己平时学的知识,分享给大家,希望可以帮助大家
展开
-
死锁的发生原因和怎么避免,写的明明白白
死锁是什么死锁就是两个或者两个以上的线程,在执行的过程中,去争夺同样一个共享资源,造成的相互等待的一个现象,如果没有外部的干预,线程会一直阻塞,无法往下去执行,这样一直处于相互等待资源的线程,我们称为死锁线程。产生死锁的条件互斥条件,共享条件X和Y只能被一个线程占用请求和保持条件,线程T1已经去的共享资源X,在等待共享资源Y的时候,不释放共享资源X不可抢占条件,其他线程不能强行抢占线程,T1占有的资源循环等待条件,线程T1等待线程T2占有的资源,线程T2等待线程T1占有的资源就是循环等待原创 2022-04-20 20:28:13 · 347 阅读 · 0 评论 -
wait和notify 为什么要在synchronized代码块中
什么是wait和notifywait和notify是用来去实现多个线程之间的一个协调,wait表示让线程进入到阻塞状态,notify让阻塞的线程被唤醒,wati和notify必然是成对出现的,如果一个线程被线程被wait()方法阻塞,那么必然需要另外一个线程通过notify()方法来唤醒,从而去实现多个线程之间的一个通信在多线程里面呢,要实现多线程之间的一个通信,除了管道流的以为,只能去通过共享变量的方法来实现,也就是说线程t1修改共享变量s,线程t2获得修改后的共享变量s的值,从而完成数据的一个通讯原创 2022-04-18 22:16:55 · 593 阅读 · 0 评论 -
基于数组的阻塞队列 ,ArrayBlockingQueue 原理
阻塞队列阻塞队列是在队列的基础上,去增加了两个附加操作,第一个队列为空的时候,获取元素的线程会等待队列为非空,当队列满时,存储元素的线程会等待队列可用,由于阻塞队列的这样一个特性,可以非常容易的去实现,生产者和消费者这样一个模型,也就是说,生产者只需要关心数据的一个生产,而消费者只需要关心数据的一个消费,所以,如果队列满了,生产者就等待,同样队列空了,消费者也需要等待。实现这样一个阻塞队列,需要用到两个非常关键技术是队列元素的一个存储线程阻塞核唤醒ArrayBlockingQueue而Ar原创 2022-04-18 21:07:11 · 382 阅读 · 0 评论 -
Lock和Synchronized的区别
Lock和Synchronized的区别1. 从功能角度来看Lock和Synchronized都是java中去用来解决线程安全问题的一个工具2. 从特性来看Synchronized是java中的同步关键字,Lock是J.U.C包中提供的接口,而这个接口有很多的实现类,包括ReentrantLock这样重入锁的实现,Synchronized可以通过两种方式去控制锁的力度一种把synchronized关键字修饰在方法层面,另一种是修饰在代码块上,可以通过synchronized加锁对象的生命周期,来原创 2022-04-11 22:39:31 · 808 阅读 · 0 评论 -
ThredLocal的底层原理
ThredLocal的底层原理ThreadLocal是什么?ThreadLocal是一种线程隔离机制,它提供多线程环境下对于共享变量访问的一个安全性,在多线程访问功效变量这一个场景里面如图,一般情况下我们解决办法对于共享变量去加锁,所以保证在同一个时刻,只有一个线程能够对共享变量进行更新,并且基于Happens-Before规则里面的一个锁监视器的一个规则,又能够保证数据修改之后,对于其他线程是可见的但是加锁呢,会带来一个性能上的下降,所以ThreadLocal用了一种换时间的一个设计思想,在每原创 2022-04-09 18:50:38 · 439 阅读 · 0 评论 -
volatile关键字有什么用?
volatile关键字有什么用?volatile作用可以保证多线程环境下共享变量的可见性通过增加内存屏障防止多个指令之间的重排序什么是可见性可见性是指当一个线程对于共享变量的修改,其他线程可以立刻看到修改之后的一个🈯️,可见性本质上由几个方面造成的cpu层面的高速缓存,在cpu里面呢设计了三级缓存去解决cpu运算效率和内存IO效率的问题,但是它也带来缓存一致性的一个问题,而在多线程执行的情况下呢,缓存一致性的问题就会导致可见性的问题,所以,对于增加了volatile关键字的一个修饰的共享变原创 2022-04-05 15:02:09 · 172 阅读 · 0 评论 -
CAS机制
什么是CAS机制CAS是Java中Unsafe类里面的一个方法,它的全称是CompareAndSwap,比较并交换的一个意思,它的主要功能是能够去保证在多线程的环境下对于共享变量修改的一个原子性。比如这样一个列子,有一个成员变量叫state,它的默认值是0,其中定义了一个方法叫doSmething(),这个方法的逻辑是先判断state是否为0,如果为0就修改成1,这个逻辑在单线程的情况下,没有任何问题,但是在多线程的环境下,会存在原子性的问题,因为这是典型的Read - Write的一个操作,一般情况原创 2022-04-05 21:02:11 · 475 阅读 · 0 评论 -
AQS理解
AQS是什么?AQS全称Abstract Queued Synchronizer是并发编程中比较核心的一个组件,多线程同步器,它是J.U.C包中多个组件的底层实现,比如Lock、CountDownLatch、Semaphore都用到了AQS,从本质上来说,AQS提供了两种锁的机制,分别是排它锁和共享锁,所谓排它锁就是存在多个线程去竞争同一个共享资源的时候,同一个时刻,只允许一个线程去访问这样一个共享资源,也就是说,多个线程只能有一个线程去获得这样一个锁的资源,比如Lock中ReentrantLock重入锁原创 2022-04-08 00:16:29 · 632 阅读 · 0 评论