
并发编程
文章平均质量分 70
qq_41423755
这个作者很懒,什么都没留下…
展开
-
面试题——ThreadLocal相关
ThreadLocal,即线程本地。如果创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个,多个线程操作这个变量的时候,实际是操作自己本地内存里面的变量,从而起到线程隔离的作用,避免了线程安全问题。原创 2023-12-11 22:18:47 · 178 阅读 · 1 评论 -
面试题——synchronized为什么是非公平锁?
非公平锁:新来的线程不会考虑entryList队列是否有等待线程,而是直接参与竞争锁。这就导致,线程尝试获取锁失败,进入阻塞队列的顺序和最终被唤醒的顺序是不一致的,也就是说你先进入队列,不代表你就会先被唤醒,因为有可能被新来的线程通过自旋抢到锁。当持有锁的线程释放锁时,该线程会执行以下两个重要操作:(1)先将锁的持有者owner 属性赋值为 null;(2)唤醒等待链表中的一个线程(假定继承者?存疑)。在这两个步骤之间,如果有其他线程刚好在尝试获取锁(例如自旋),则可以马上获取到锁。原创 2023-12-10 15:24:00 · 171 阅读 · 1 评论 -
面试题——多线程中synchronized锁的升级流程
如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。线程A要执行同步锁的代码时,该对象被当做同步锁,线程抢到该锁时,该对象的对象头当中Mark Word字段中的锁标志位为01,偏向锁位为1,前23位记录线程A的ID,对象没有被当做锁的时候,为普通对象,Mark Word锁标志位为01,偏向锁位为0,如果失败,则说明发生竞争,原创 2023-12-10 13:33:43 · 99 阅读 · 1 评论 -
面试题—— synchronized 和 ReentrantLock 的区别
(1)两者都是可重入锁可重入锁指的是在一个线程中可以多次获取同一把锁,比如:一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法,而无需重新获得锁,两者都是同一个线程每进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。_count_recursionAQSstate(2)synchronized 依赖于 JVM 而 ReentrantLock 依赖于 API。原创 2023-12-09 21:59:48 · 154 阅读 · 0 评论 -
面试题——线程的sleep()方法和yield()方法有什么区别?
不同系统的行为一致: sleep 方法在不同的操作系统和 JVM 中的行为更加一致,它通过底层操作系统的休眠机制实现。而 yield 方法则更依赖于调度器的具体实现,调度器在不同的环境(比如在单核CPU或者多核CPU下yield的效果不一样)中可能表现不一致。精准的时间控制:sleep 方法允许精确地指定线程休眠的时间,而 yield 方法只是一种提示,调度器可以忽略它。sleep()方法不考虑自身的优先级,所以会给比它优先级低的线程机会;sleep()方法比yield()方法具有更好的移植性。原创 2023-12-08 21:23:35 · 133 阅读 · 0 评论 -
volatile原理
volatile可保证可见性(读写屏障实现)和有序性(读写屏障实现),禁止了指令重排序,无法解决指令交错的问题(即无法保证原子性)synchronized可保证原子性(不会出现指令交错的问题),可见性以及有序性(如何实现?),但不禁止指令重排序(存疑)原创 2023-12-09 15:05:27 · 150 阅读 · 0 评论