6
回答
java cas循环占用cpu资源问题
华为云数据库免费试用   

在多线程高并发情况下,使用cas修改数据有可能一直无法修改成功导致占用cpu资源,效率低下。请问各位大神有什么解决方式吗?我能想到的是循环n次之后可以暂停m毫秒继续尝试修改,如此反复k次如果还不成功可以抛出异常了。。。

举报
清尘V
发帖于2年前 6回/361阅
共有6个答案 最后回答: 1年前

首先没明白你说的“cas修改数据有可能一直无法修改成功导致占用cpu资源”

其次多线程并发情况下你用什么“暂停m毫秒”用“Thread.sleep”?。。。。

个人建议,考虑分发机制

引用来自“北极心”的评论

首先没明白你说的“cas修改数据有可能一直无法修改成功导致占用cpu资源”

其次多线程并发情况下你用什么“暂停m毫秒”用“Thread.sleep”?。。。。

个人建议,考虑分发机制

第一个问题,可以参考以下代码:

    public final int getAndSet(int newValue) {
        for (;;) {
            int current = get();
            if (compareAndSet(current, newValue))
                return current;
        }
    }

高并发情况下,for循环可能无法终止。

暂停的初步想法是Thread.sleep,分发机制是什么?

多线程大并发如果考虑Thread.sleep那就错鸟,那是作死的节奏!

分发机制就是把数据推送出去在其他地方处理数据修改

--- 共有 1 条评论 ---
清尘V你说的这个方案应该是异步化处理了,我说的是同步处理,加sleep是为了暂停争夺cpu资源,譬如休眠50ms之后再继续 2年前 回复

sleep会卡死你,不信你试试,

你要同步的话考虑rpc了

--- 共有 2 条评论 ---
清尘V觉得跟我说的暂定一段时间相似 2年前 回复
清尘V在网上看的这个答案,不太懂:自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。如果JVM能支持处理器提供的pause指令那么效率会有一定的提升,pause指令有两个作用,第一它可以延迟流水线执行指令(de-pipeline),使CPU不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零。第二它可以避免在退出循环的时候因内存顺序冲突(memory order 2年前 回复

他说的“如果”JVM能支持处理器提供的pause指令,如果啊

jvm能配置pause指令么?不能吧,对jvm优化好像没见过可以配置pause指令,你可以请教一下其他大神

--- 共有 1 条评论 ---
清尘V是的 感觉就是添加延时机制就好了 2年前 回复
顶部