Java并发(十四)----悲观互斥与乐观重试

这篇具有很好参考价值的文章主要介绍了Java并发(十四)----悲观互斥与乐观重试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 悲观互斥

互斥实际是悲观锁的思想

例如,有下面取款的需求

interface Account {
    // 获取余额
    Integer getBalance();
​
    // 取款
    void withdraw(Integer amount);
​
    /**
     * 方法内会启动 1000 个线程,每个线程做 -10 元 的操作
     * 如果初始余额为 10000 那么正确的结果应当是 0
     */
    static void demo(Account account) {
        List<Thread> ts = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            ts.add(new Thread(() -> {
                account.withdraw(10);
            }));
        }
        long start = System.nanoTime();
        ts.forEach(Thread::start);
        ts.forEach(t -> {
            try {
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        long end = System.nanoTime();
        System.out.println(account.getBalance()
                + " cost: " + (end-start)/1000_000 + " ms");
    }
}

用互斥来保护

class AccountSync implements Account {
​
    private Integer balance;
​
    public AccountUnsafe(Integer balance) {
        this.balance = balance;
    }
​
    @Override
    public Integer getBalance() {
        synchronized (this) {
            return this.balance;
        }
    }
​
    @Override
    public void withdraw(Integer amount) {
        synchronized (this) {
            this.balance -= amount;
        }
    }
}

2. 乐观重试

另外一种是乐观锁思想,它其实不是互斥文章来源地址https://www.toymoban.com/news/detail-610386.html

class AccountCas implements Account {
    private AtomicInteger balance;
​
    public AccountCas(int balance) {
        this.balance = new AtomicInteger(balance);
    }
​
    @Override
    public Integer getBalance() {
        return balance.get();
    }
​
    @Override
    public void withdraw(Integer amount) {
        while(true) {
            // 获取余额的最新值
            int prev = balance.get();
            // 要修改的余额
            int next = prev - amount;
            // 真正修改
            if(balance.compareAndSet(prev, next)) {
                break;
            }
        }
    }
}
​
​
​
​

到了这里,关于Java并发(十四)----悲观互斥与乐观重试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • django实现悲观锁乐观锁

    前期准备 1.原生mysql悲观锁 2.orm实现上述(悲观锁)  3 乐观锁秒杀--》库存还有,有的人就没成功  

    2024年02月12日
    浏览(42)
  • [锁]:乐观锁与悲观锁

    摘要:乐观锁;悲观锁;实现方法;本地锁;分布式锁;死锁;行级锁;表级锁 问题 : ① 在多个线程访问共享资源时,会发生线程安全问题,例如:在根据订单号生成订单时,若用户第一次由于某种原因(网络连接不稳定)请求失败,则会再次发生请求,此时便会产生同一

    2024年02月08日
    浏览(36)
  • 悲观锁和乐观锁、缓存

    悲观锁: 悲观锁的实现通常依赖于数据库提供的机制,在整个处理的过程中数据处于锁定状态,session的load方法有一个重载方法,该重载方法的第三个参数可以设置锁模式,load(object.class , int id,LockMode.?),该方法的?就是具体的锁模式。 乐观锁: 乐观锁使用版本号或者时间戳

    2024年02月09日
    浏览(42)
  • 悲观锁和乐观锁(易懂)

    这里可以把悲观锁看作悲观的人,啥事都往最坏的方向想。乐观锁看作乐观的人,啥事都往最好的方向想。 首先,说一下悲观锁。 悲观锁就是假设并发情况下一定会有其他线程来修改数据,因此在处理数据之前,先将数据锁住,确保其他线程不能进行修改 。感觉像一个过于

    2024年02月08日
    浏览(37)
  • Java多线程&并发篇----第二十四篇

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 采用时间片轮转的方式。可以设置线程的优先级,会映射到下层的系统上

    2024年01月20日
    浏览(71)
  • [锁]:乐观锁、悲观锁与死锁

    摘要:乐观锁;悲观锁;实现方法;本地锁;分布式锁;死锁;行级锁;表级锁 问题 : ① 在多个线程访问共享资源时,会发生线程安全问题,例如:在根据订单号生成订单时,若用户第一次由于某种原因(网络连接不稳定)请求失败,则会再次发生请求,此时便会产生同一

    2024年02月08日
    浏览(37)
  • MySQL乐观锁与悲观锁

    遇见并发情况,需要保证数据的准确性,也就是与正确的预期一致,此时就会用到锁。 锁是在并发下控制程序的执行逻辑,以此来保证数据按照预期变动。 如果不加锁,并发情况下的可能数据不一致的情况,这是个概率问题。 乐观锁很乐观,假设数据一般情况不会造成冲突

    2024年01月23日
    浏览(35)
  • 什么是乐观锁和悲观锁?

    乐观锁和悲观锁是并发控制的两种不同策略,用于在多线程环境下管理共享资源的访问。它们有不同的思想和实现方式: 悲观锁(Pessimistic Locking) : 思想 :悲观锁的思想是,它假定在并发访问中会发生冲突,因此在访问共享资源之前会先加锁,以防止其他线程访问。悲观

    2024年02月10日
    浏览(37)
  • redis实战---乐观锁与悲观锁

    最近一直在研究Redis,今天学习到了乐观锁与悲观锁的部分,在这里进行总结。 Redis是一个内存中的键值存储系统,支持多种数据结构,如字符串、哈希、列表等。 Redis提供了两种锁机制,即乐观锁和悲观锁。 乐观锁是一种乐观的并发控制策略,它认为数据在大多数情况下

    2023年04月09日
    浏览(38)
  • mybatis使用乐观锁和悲观锁

    悲观锁和乐观锁的概念: 悲观锁:就是独占锁,不管读写都上锁了。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。 乐观锁:不上锁,读取的时候

    2024年02月10日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包