作者回复: 对的
作者回复: 大家都一致想到了限流,限流是非常必要的,无论我们的程序优化的如何,还是有上限的,限流则是一种兜底策略。
除了这个,我们还可以使用协程来优化线程由于阻塞等待带来的上下文切换性能问题,可以回顾第19讲,我们也用协程实现过生产者消费者模式。
作者回复: 看来有实战经验👍🏻
作者回复: 可以的,很通用的一种解决方案
作者回复: 增加消费者是一种方式
作者回复: LinkedList是非线程安全容器,存在线程安全问题的
作者回复: 这有一个lock锁,不会同时进来两个线程。
作者回复: 建议再等等官方的协成组件,或改用go实现,目前Java的一些第三方开源组件的生产环境的实践以及性能验证有待考验,如果不介意当小白鼠,也可以试试这些第三方协成组件。
作者回复: 是的,可以基于消息队列或redis缓存来实现。
作者回复: 导致CPU飙升只是一个性能的直接表现,是不是有对象一直在创建,所以导致一直在GC。建议打开dump日志查看具体的内存使用情况以及对象的创建分布情况。
作者回复: 是的
作者回复: 限流是一种方式,线程池其实也是一种限流手段。我们在之前协程这一讲中,其实也用协程代替线程实现了生产者消费者模式,这也不乏是一种优化方式。
作者回复: 这里同步更新下,新增了以下代码作为实时库存:
private AtomicInteger inventory = new AtomicInteger(0);
我们这里是基于LinkedList来存取库存的,虽然LinkedList是非线程安全,但我们新增是操作头部,而消费则是操作队列的尾部,理论上来说没有线程安全问题。而库存的实际数量inventory是基于AtomicInteger(CAS锁)线程安全类实现,即可以保证原子性,也可以保证消费者和生产者之间是可见的。