面试
请别比我浪
这个作者很懒,什么都没留下…
展开
-
有哪些常见的AQS锁?
此后,其他线程再 tryAcquire() 时就会失败,直到 A 线程 unlock() 到 state=0(即释放锁)为止,其它线程才有机会获取该锁。:设定一个信号量,当调用acquire()时判断是否还有信号,有就获取一个信号量,没有就阻塞等待其他线程释放信号量,当调用release()时释放一个信号量,唤醒阻塞线程。:给计数器设置一个初始值,当调用countDown()时计数器减1,当调用await() 时判断计数器是否归0,不为0就阻塞,直到计数器为0。原创 2023-06-15 18:34:00 · 237 阅读 · 0 评论 -
AQS简述
这个虚拟的队列是通过一些节点来实现的,会将暂时获取不到锁的线程封装成节点加入到该队列当中,也就是说当一个线程需要获取锁时,它会尝试进行CAS操作修改AQS内部的状态变量state,如果成功获取到锁,线程就可以正常执行。AQS是一个抽象类,主要用来构建锁和同步器,如ReentrantLock,Semaphore(信号量),CountDownLatch(倒计时器),CyclicBarrier(循环栅栏)等等都是基于AQS。1、独占,只有一个线程能执行,如ReentrantLock)原创 2023-06-15 17:41:11 · 56 阅读 · 0 评论 -
CAS简述
(3)存在ABA问题:假设线程 A 首先读取共享变量的值为 A,然后线程 B 修改了这个共享变量的值成为 B,并把它又改回了 A,然后线程 A 再次使用 CAS 操作时,发现当前共享变量的值仍为 A,就会误认为没有其他线程对共享变量进行过操作,从而继续执行后续的操作,这就是ABA问题。CAS 的全称是 Compare And Swap(比较与交换) ,可以保证原子性,常用于实现乐观锁。它的思想很简单,就是用一个预期值和要更新的变量值进行比较,两值相等才会进行更新。(1)只能保证一个共享变量的原子操作。原创 2023-06-15 17:20:51 · 85 阅读 · 0 评论