• sunlight001
    2018-06-21
    这个看着很吃力啊,都没接触过😂
    
     55
  • 丘壑
    2018-09-13
    栈来实现blockqueue,个人感觉比较好的有
    方案一:总共3个栈,其中2个写入栈(A、B),1个消费栈栈C(消费数据),但是有1个写入栈是空闲的栈(B),随时等待写入,当消费栈(C)中数据为空的时候,消费线程(await),触发数据转移,原写入栈(A)停止写入,,由空闲栈(B)接受写入的工作,原写入栈(A)中的数据转移到消费栈(C)中,转移完成后继续(sign)继续消费,2个写入栈,1个消费栈优点是:不会堵塞写入,但是消费会有暂停

    方案二:总共4个栈,其中2个写入栈(A、B),2个消费栈(C、D),其中B为空闲的写入栈,D为空闲的消费栈,当消费栈(C)中的数据下降到一定的数量,则触发数据转移,这时候A栈停止写入,由B栈接受写入数据,然后将A栈中的数据转入空闲的消费栈D,当C中的数据消费完了后,则C栈转为空闲,D栈转为激活消费状态,当D栈中的数据消费到一定比例后,重复上面过程,该方案优点即不堵塞写入,也不会造成消费线程暂停


    展开
     2
     15
  • 石头狮子
    2018-06-21
    实现课后题过程中把握以下几个维度,
    1,数据操作的锁粒度。
    2,计数,遍历方式。
    3,数据结构空,满时线程的等待方式,有锁或无锁方式。
    4,使用离散还是连续的存储结构。
    
     7
  • crazyone
    2018-06-22
    从上面这些角度,能够理解 ConcurrentLinkedDeque 和 LinkedBlockingQueue 的主要功能区别。 这段应该是 "ConcurrentLinkedDeque 和 LinkedBlockingDeque 的主要功能区别"
    
     5
  • 吕倩
    2018-12-03
    老师你好,在读ArrayBlockingQueue源码的时候,发现很多地方都有 final ReentrantLock lock = this.lock; 这样的语句,处于什么原因会将类变量复制一份到局部变量,然后再使用呢?
    
     4
  • 猕猴桃 盛哥
    2018-06-22
    {
        "test":[
            [
                89,
                90,
                [
                    [
                        1093,
                        709
                    ],
                    [
                        1056,
                        709
                    ]
                ]
            ]
        ]
    }

    测试题:这个json用java对象怎么表示?
    展开
     1
     4
  • Lighters
    2019-04-27
    希望能够增加一些具体的业务使用场景,否则只是单纯的分析,太抽象了
    
     3
  • 无呢可称
    2018-06-27
    @Jerry银银。用两个栈可以实现fifo的队列

    
     3
  • 石头狮子
    2018-06-21
    实现课后题过程中把握以下几个维度,
    1,数据操作的锁粒度。
    2,计数,遍历方式。
    3,数据结构空,满时线程的等待方式,有锁或无锁方式。
    4,使用离散还是连续的存储结构。
    
     3
  • 拯救地球好累
    2019-05-20
    从几个问题来学习新的框架或工具:
    1.用来解决什么问题?常见的应用场景有哪些?
    2.jdk内部或第三方框架在什么场景中如何运用?
    3.有哪几种类似的实现或工具?它们之间有何区别?在结构层次上有何联系?
    4.从源码上看关键代码有哪几个地方?
    
     1
  • 南北少卿
    2018-12-14
    杨老师,你好,最近我debug过ConcurrentLinkedQueue的源码,第一次添加元素的时候,为什么head指向添加的元素,而tail指向自己,始终搞不明白,经过p.casNext(null, newNode)操作之后,这中间的变化到底是怎么回事?您能解答下吗?望指点.我的微信号:LEE794112629
    
     1
  • 酱了个油
    2018-08-05
    队列的一个问题是不能持久化、不能做到分布式,有时候考虑到系统可靠性,使用的机会不多。杨老师可以给一些使用队列的例子吗?
    
     1
  • 汉彬
    2018-07-17
    用栈实现BlockingQueue,我的理解是:栈是LIFO,BlockingQueue是FIFO,因此需要两个栈。take时先把栈A全部入栈到栈B,然后栈B出栈得到目标元素;put时把栈B全部入栈到栈A,然后栈A再入栈目标元素。相当于倒序一下。

    不知道理解对不对,请老师指出。
    
     1
  • 爱新觉罗老流氓
    2018-07-03
    杨老师,“与弱一致性对应的,就是我介绍过的同步容器常见的行为“fast-fail”,也就是检测到容器在遍历过程中发生了修改,则抛出 ConcurrentModificationException,不再继续遍历。”
    这一段落里,快速失败的英文在doc上是“fail-fast”,在ArrayList源码中文档可以搜到。
    还有,同步容器不应该是“fail-safe”吗?

    作者回复: 谢谢指出,我查查是不是我记反了

    
     1
  • Jerry银银
    2018-06-22
    用栈来实现BlockingQueue,换句话是说,用先进后出的数据结构来实现先进先出的数据结构,怎么感觉听起来不那么对劲呢?请指点
    
     1
  • 灰飞灰猪不会灰飞.烟...
    2018-06-21
    老师 线程池中如果线程已经运行结束则删除该线程。如何判断线程已经运行结束了呢?源码中我看见按照线程的状态,我不清楚这些状态值哪来的。java代码有判断线程状态的方法吗?谢谢老师

    作者回复: 所谓结束是指terminated?正常的线程池移除工作线程,要么线程意外退出,比如任务抛异常,要么线程闲置,又规定了闲置时间;线程池中线程是把额外封装的,本来下章写了,内容篇幅超标移到后面了,慢慢来;有,建议学会看文档,自己找答案

    
     1
  • Geek_8c5f9c
    2020-02-03
    fail-fast不是同步容器的行为, fail-safe才是。
     1
    
  • Comdotwang
    2020-01-20
    老师 您好。 我看到SynchronousQueue 不能缓存任何元素。 但是据我所知,SynchronousQueue take和put操作都会生成一个SNode 或 QNode。放入栈或队列中。这些不算是缓存么。 我有些疑惑。
    
    
  • 天王
    2020-01-04
    20 ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别 1 Java.util.concurrent包下面的所有容器都叫并发容器,concurrent开头的叫并发容器,concurrent基于lock-free模式,在多线程场景,能提供较大的吞吐量 ,LinkedBlocking是基于锁,提供了BlockingQueue的等待方法 2 线程安全容器大概可以分为concurrent*,CopyOnWrite和Blocking等三类,CopyOnWrite需要拷贝一份数据,在拷贝数据上修改,开销比较大,常见的容器,有比较强的一致性,如果遍历过程发生修改,会抛出ConcurrentModificationException,而Concurrent*容器可以继续遍历。3 Blocking同步容器,需要等待,以代码为例 用BlockingQueue去实现生产者消费者,不用自己手工去实现轮询,条件判断等逻辑。
    
    
  • Paul Shan
    2019-11-25
    并发中的一致性是有代价的,如何支付这个代价延伸出不同的实现。ConcurrentLinkedQueue 就是提供较高的吞吐率而牺牲一部分一致性的解决方案,也就是遍历的时候,数据被修改了而不查,size也没有100%正确。要获得这些保证,就要加锁牺牲吞吐量 LinkedBlockingQueue 就是这种高准确度而相对较低吞吐量的解决方案。加入其他维度例如是否无限,Java还有其他选择。
    
    
我们在线,来聊聊吧