
锁相关
文章平均质量分 60
底层
闻臻
这个作者很懒,什么都没留下…
展开
-
CAS,自旋锁底层原理
底层原理:自旋锁 Unsafe类调用操作系统底层资源执行任务 valueOffset = unsafe.objectFieldOffset (AtomicInteger.class.getDeclaredField("value")); 像C的指针一样直接操锁内存 unsafe.getAndAddInt(this,valueOffset,1); this:当前对象 valueOff...原创 2019-12-09 12:11:54 · 1240 阅读 · 0 评论 -
Synchronized原理
无原创 2022-07-22 16:01:17 · 550 阅读 · 0 评论 -
8种锁
一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了, 其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一一个线程去访问这些synchronized方法 锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法 加个普通方法后发现和同步锁无关 换成两个对象后...原创 2020-05-06 16:22:10 · 183 阅读 · 0 评论 -
深入理解AQS底层源码(一)——lock.lock()
前期准备: 1、可重入锁(递归锁):外层使用锁后,在内层仍然可以使用锁。同一个线程可以获取多个同一把锁。 优点:避免死锁。特点:锁对象是同一个对象 2、LockSupport:LockSupport.park(); LockSupport.unPark(Thread t); 类比 synchronized wait notify ; lock.newCondition await signal wait notify必须和synchronized搭配使用且先wait后notify; awai...原创 2020-11-19 15:30:01 · 1414 阅读 · 0 评论 -
深入理解AQS底层源码(二)——lock.unlock()
接着上一次线程2和线程3park后,需要unpark()唤醒。 第一步:线程1执行完成后,调用lock.lock()方法,实际调用的是sync.release(1)方法; 第二步:线程1调用底层的release(int arg)方法,走到tryRelease(arg)方法; getState() = 1,因为之前线程1加锁后state设值为1,它也是volatile修饰的。 Thread.currentThread() = 线程1,c = 0,free = true,setState(0),返回原创 2020-11-19 17:16:20 · 187 阅读 · 0 评论