leetcode-1117 悲观锁与乐观锁的实现

  看题目:

  第一种解法采用绝对悲观锁保证绝对的线程安全,思路很简单:不考虑线程协作写代码,然后找出单线程环境下存在控制依赖与数据依赖且涉及共享变量的部分,保证其原子性后确定互斥关系,决定那些操作是互斥的,则共用一把锁。

复制代码
class H2O {

    int hNums=0;
    int oNums=0;

    public H2O() {
        
    }

    public final void hydrogen(Runnable releaseHydrogen) throws InterruptedException {
        while(true){
            while(hNums-oNums>=2){
                Thread.yield();
            }
            synchronized(this){
                if(hNums-oNums>=2){
                    continue;
                }
                // releaseHydrogen.run() outputs "H". Do not change or remove this line.
                releaseHydrogen.run();
                hNums++;
            }
            break;
        }
    }

    public final void oxygen(Runnable releaseOxygen) throws InterruptedException {
            while(true){
                while(hNums-oNums<2){
                    Thread.yield();
                }
                synchronized(this){
                    if(hNums-oNums<2){
                        continue;
                    }
                    // releaseOxygen.run() outputs "O". Do not change or remove this line.
                    releaseOxygen.run();
                    oNums++;
                }
                break;
            }
    }
}
复制代码

  由于每个线程的任务耗时非常短,所以采用锁的方式大部分时间都消耗在了竞争锁和开锁上,这种情况下采用 CAS 结合繁忙等待效率会更高:

复制代码
class H2O {

    private Semaphore h = new Semaphore(2);
    private Semaphore o = new Semaphore(0);

    public H2O() {
    }

    public void hydrogen(Runnable releaseHydrogen) throws InterruptedException {
        h.acquire();
        // releaseHydrogen.run() outputs "H". Do not change or remove this line.
        releaseHydrogen.run();
        o.release();
    }

    public void oxygen(Runnable releaseOxygen) throws InterruptedException {
        o.acquire(2);
        // releaseOxygen.run() outputs "O". Do not change or remove this line.
        releaseOxygen.run();
        h.release(2);
    }
}
复制代码

 

posted @   牛有肉  阅读(350)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示