• wenxueliu
    2018-06-26
    建议;

    1. 希望能有推外内存的主题,范型部分希望能与cpp比较讲解。
    2. 一些主题如果已经有公开的比较好的资料,可以提供链接,对重点强调即可。希望能看到更多公开资料所没有的信息,这也是老鸟们付费的初衷。
    同意的点赞
     1
     99
  • 墨飞域
    2018-08-07
    这一讲对于我来说,挺有难度的,还是基础比较薄弱,整体上没太听懂。老师对于Java的理解真是太深入了,等我以后技术精进了,再回来看看老师的36讲,应该会有新的认识。继续往下听吧,已经懂点的加深理解,没听过的就当是听了名字以后用到了再仔细研究
    
     21
  • Cui
    2018-06-26
    老师,看了AQS的实现原理后,我再回顾了您之前关于synchronized的文章,心中有些疑问:
    1、synchronized在JVM中是会进行锁升级和降级的,并且是基于CAS来掌握竞争的情况,在竞争不多的情况下利用CAS的轻量级操作来减少开销。
    2、而AQS也是基于CAS操作队列的,位于队列头的节点优先获得锁,其他的节点会被LockSupport.park()起来(这个好像依赖的是操作系统的互斥锁,应该也是个重量级操作)。
    我觉得这两种方式都是基于CAS操作的,只是操作的对象不同(一个是Mark Word,一个是队列节点),当竞争较多时,还是不可避免地会使用到操作系统的互斥锁。然而,我再测试这两者的性能时,在无竞争的情况下,两者性能相当,但是,当竞争起来后,AQS的性能明显比synchronized要好(测试案例是8个线程并发对一个int递增,每个线程递增1000万次,AQS的耗时大概要少30%),这是为什么呢?
    展开

    作者回复: Locksupport的实现据说速度快,我也没具体对比过;不过jdk9里,monitor相关操作也加快了,可以看看jep143

    
     13
  • OneThin
    2018-07-16
    能否出一节讲一下unsafe,感觉这个才是最基础的。另外unsafe为什么叫unsafe呢
    
     12
  • 三口先生
    2018-06-26
    大于0取消状态,小于0有效状态,表示等待状态四种cancelled,signal,condition,propagate

    作者回复: 不错

    
     11
  • I.am DZX
    2018-06-26
    CANCELLED 1 因为超时或中断设置为此状态,标志节点不可用
    SIGNAL -1 处于此状态的节点释放资源时会唤醒后面的节点
    CONDITION -2 处于条件队列里,等待条件成立(signal signalall) 条件成立后会置入获取资源的队列里
    PROPAGATE -3 共享模式下使用,头节点获取资源时将后面节点设置为此状态,如果头节点获取资源后还有足够的资源,则后面节点会尝试获取,这个状态主要是为了共享状态下队列里足够多的节点同时获取资源
    0 初始状态
    展开

    作者回复: 好

    
     11
  • 二木🐶
    2018-06-28
    一直很好奇,为何CAS指令在发现内容未变的时候就能判断没有其他线程修改呢?可能被修改后的值与比较的值一样呀
    
     6
  • 卡斯瓦德
    2018-07-05
    老师请教个问题,acquireQueued的源代码中,使用for(;;)做了个自旋锁吧,作者为什么不用while(true),这种方式呢,是因为开销不一样吗?

    作者回复: 也许,这个我不知道具体原因,看上去while会比for多一个变量

    
     5
  • 黄明恩
    2018-06-28
    老师可否分析下Object.wait和notify的原理
    
     2
  • 三木子
    2018-06-26
    最近遇到配置tomcat连接池,导致cpu过高问题,最后发现配置连接池数过大导致上下文切换次数过多
    ,也就是线程池中任务数过少,空闲的线程过多,我想问为什么会导致上下文切换过多?
    
     2
  • 天王
    2020-01-10
    22 AutomicInteger原理是什么,cas原理,cas操作怎么应用 1 Automic提供了对int类型的原子操作和更新,操作基于cas原理,cas全称Compare and Swap, cas的原理是操作前试图获取当前值,在操作时,看值是否改变,如果未改变,代表没有其他线程同步修改,操作成功,已经改变,返回操作失败或者重试。有2个属性 jdk.internal.misc.Unsafe u=idk.internal.misc.Unsafe.getUnsafe(); volatile int value;Long VALUE=U.objectFiledOffset(AutomicInter.Class,"value"); Unsafe会利用value字段的内存地址偏移完成操作 2 cas底层实现 依赖于CPU底层提供的指令,java提供了2个公共api支持cas操作,long tid=Thread.currenThread().getId(); AutomicFiledUpdator.compareAndSet(this,0l,tid);Automic包提供了很多原子处理类,是很多原子操作的选择,java.9以后提供了 Variable Hand Api, private static final VarHandle handle 首先获取句柄,再调用cas方法,推荐使用Variable Handle Api,后续维护有保障,3 AQS AbstractQueueSynchronized 是实现各种同步结构的基础
    展开
    
     1
  • Geek_987169
    2019-03-26
    老师,您说的"更加紧凑",是什么意思?不太理解
    
     1
  • 77爸比
    2018-07-09
    CAS有部分实现是解决ABA问题,可以讲一下ABA问题是如何解决的,除了version外,还有没有其他的方式
    
     1
  • Paul Shan
    2019-11-26
    CAS适用的场景是多数修改都成功,少数不成功的修改靠增加CPU来轮询,也就是说只有CPU轮询付出的代价足够小才经济。
    
    
  • prepared
    2019-11-20
    行尾注释不建议吧
    
    
  • 亮灯
    2019-10-15
    老师,您好, shouldParkAfterFailedAcquire表示是否挂起当前线程,为什么要有这个判断?这个判断有什么用?
    
    
  • 流光
    2019-07-03
    老师,您的倒数第二个方法是非公平说的获取方法没问题,最后的acquireQueued()是公平锁的获取方法,前天面试就被面试官喷了
     1
    
  • Pine
    2019-04-30
    请教老师一个问题,基本类型前面加volatile,大概能明白什么意思。 可加在引用类型前面就不是很明白了?
    
    
  • gogo
    2019-04-28
    关于状态的其他童鞋已经说啦,

    AQS的Node中包含了 Thread和waitStatus,也就是链表中需要获取锁的线程吧~!
    
    
  • ylw666
    2019-01-26
    LongAdder这里,说要考虑紧凑性的影响,不清楚指的是哪方面的考虑

    作者回复: 紧凑就是说内存使用效率,有些高性能应用会对此提出苛刻要求

    
    
我们在线,来聊聊吧