• 青莲
    2019-05-09
    sleep 无法被唤醒,只能时间到后自己恢复运行,当真正的条件满足了,时间未到,接着睡眠,无性能可言
    
     31
  • 代码搬运工
    2019-05-09
    当从消息队列接收消息失败时,while循环会一直执行下去,永远不会结束,回占用大量资源。

    作者回复: 👍

     2
     21
  • zhangwei
    2019-05-18
    老师,我有个疑问,希望帮忙解答。如果Web应用是集群的,A节点处理HTTP请求后发了MQ,B节点的onMessage消费了回执消息,那么A节点怎么把结果响应给客户端呢?疑问好久了,希望老师给个思路,谢谢!

    作者回复: 我了解有人是这么做的:把回执消息放到redis的list中,按照ip重新分组之后从redis中再次消费。
    也可以按照ip建立不同的topic。

     2
     17
  • Felix Envy
    2019-05-12
    老师,感觉如果有方法调用了GuardedObect.create方法但是没有任何其他线程调用fireEvent方法会造成内存泄漏啊,这种情况需要考虑吗?

    作者回复: 👍 需要,等待超时后要把他移除。

    
     11
  • Mr.Brooks
    2019-05-10
    没有锁也无法保证内存可见性吧

    作者回复: 👍

    
     9
  • linqw
    2019-05-25
    总结:Guarded Suspension模式,要解决的是,发送消息的线程和消费消息结果的线程不是同一个,但是消息结果又需要由发送的线程进行处理,为此需要为每个消息创建出类似大堂经理,生活中一般是只有一个大堂经理,但是在编程世界里需要为每个分配一个大堂经理,大堂经理主要做的事情就是发送线程发送完消息时,将其阻塞,提供消息结果的回调接口,通知阻塞的发送线程消费消息结果。
    课后习题:1、使用sleep如果消息结果已经返回,还需等到sleep超时,才能继续执行2、使用加锁的await方法可以保证可见性,如果使用sleep的话,需要给obj加上volatile3、感觉在sent(message)成功后才阻塞,不然有可能mq接收消息失败,while循环会一直执行下去,sent失败,直接响应提示给前端。
    
     7
  • 张三
    2019-05-10
    接入微信支付支付宝支付里边,也需要提供一个回调函数,onChange()就是一个回调函数吧,不过微信支付宝支付是异步回调,是不是也可以改成这种?微信支付宝里边的其它第三方支付是不是就是这种模式,因为支付成功之后跳转到它们自己的页面,而不是微信支付宝官方的支付成功界面

    作者回复: 这个回调函数和mq的回调函数从服务接入方的角度看是一样的

    
     4
  • null
    2019-06-03
    老师,您好!
    我想到了一个场景:​线程 t1 提交了消息 m1,线程 t2 提交了消息 m2,此时都在 get() 方法处等待结果返回。m2 先被处理完,this.obj 对应的是消息 m2 的结果,调用 fireEvent() 唤醒 t1 和 t2,t1 竞争到锁资源,消费了 m2 的结果 this.obj。

    如果存在这种场景,再维护一个 ConcurrentHashMap,key 是 msg.id,value 是对应的 obj,是否就能解决结果这问题?

    谢谢老师!
    展开

    作者回复: 只要唤醒的时候能找到正确的线程就可以,不知道你的方法是不是能做到

     2
     2
  • 晓杰
    2019-05-09
    用sleep的话只能等睡眠时间到了之后再返回while循环条件去判断,但是wait相当于和singal组成等待唤醒的机制,这样满足条件的概率更大一些,性能也更好
    
     2
  • zero
    2019-05-09
    wait会释放占有的资源,sleep不会释放
    
     2
  • 放个屁臭到了自己
    2019-11-25
    sleep 不是释放锁
    
     1
  • 杨鹏程baci
    2019-07-05
    老师好,Message r = get(t->t != null); 这个地方里面的t是什么参数啊,有点看的不是很懂,然后在get方法里面!p.test(obj)里面是判断了啥,就这里有点看的不是很明白,谢谢!
     1
     1
  • Rancood
    2019-05-22
    这个模式了解了,但是实例中业务有点懵,handleWebReq方法最终拿到的是自己发送出去的message消息;是不是应该在onMessage方法唤醒等待线程之前进行业务处理,生成新的Message消息newMsg,然后把newMsg传到fireEvent里面,这样拿到的是反馈的结果。请老师指点一下
     1
     1
  • 橘子
    2019-05-09
    这让我想到了之前很火的sleep排序算法,哈哈
    
     1
  • 朱晋君
    2019-05-09
    如果以文中的最后一段示例代码来看,每一个请求生成一个id,对应一个GuardedObject,并没有线程安全问题。我觉得可以去掉锁。
    但是加sleep的话,没有办法唤醒,只能等到超时。

    作者回复: await和notify获取锁才能调用,所以不能去掉锁

    
     1
  • Chuan
    2020-02-09
    这里有一个区别就是每次都创建了一个GuardedObject,相当于创建了多个大堂经理,这里和现实中有点不一样。目的是,如果使用一个GuardedObject,在singalAll时,可能会导致线程2的回执结果被线程1消费,即锁冲突。所以这里每次都创建不同的GuardedObject,其内部的锁也不同,在唤醒的时候就不会出错了。
    
    
  • 书中迷梦
    2020-01-20
    老师这个示例列举的不太严谨,在单机情况是,文中说的没问题,但是到了分布式系统里面,就会导致,有的通知了但是该节点并没有阻塞队列
    
    
  • Cv
    2020-01-03
    等待线程和回执线程是两个线程, 可见性可以通过添加volatile解决, 但是不加锁会有线程安全问题: p.test(obj)执行过程中obj被改变了可能会有未知问题.
    
    
  • anotherJJz
    2019-12-24
    想请问一下,通常本地的onMessage方法,怎么暴露给外部的服务调用?
    
    
  • 梦倚栏杆
    2019-12-11
    Java服务接收请求,处理,响应是不是也是一个异步变同步的过程。

    多线程处理,对于客户端而言是同步的。
    
    
我们在线,来聊聊吧