首页 > 其他分享 >悲观锁,乐观锁

悲观锁,乐观锁

时间:2024-09-07 18:54:26浏览次数:7  
标签:count String gift 乐观 SendThread 悲观 new public

悲观锁:一上来就加锁,每次只能一个线程进来,访问完毕后再解锁。

乐观锁:一上来不上锁,认为是没有问题的,大家一起跑,等出现线程安全时才开始控制。

  

public class Test1 {
    private static AtomicInteger count = new AtomicInteger(0);

    public static void main(String[] args) {
        Runnable target = new MyRunnable();
        for (int i = 1; i <= 100; i++) {
            new Thread(target).start();
        }
    }

    static class MyRunnable implements Runnable {
        private int count = 0;
        @Override
        public void run() {
            for (int j = 0; j < 100; j++) {
               
                System.out.println(Thread.currentThread().getName() + " " + (++count));//悲观锁。
               
            }
        }
    }
    static class MyRunnable implements Runnable {
        private AtomicInteger count = new AtomicInteger(0);
        @Override
        public void run() {
            for (int j = 0; j < 100; j++) {

                
                System.out.println(Thread.currentThread().getName() + " " + count.incrementAndGet());//乐观锁
            }
        }
    }
}

案例:发礼物

1000份礼物。小明和小红分发,算出每人发多少礼物,当礼物小于10份,停止发放。

public class test {
    public static void main(String[] args) throws InterruptedException {
        // 创建100个礼品
        List<String> gift = new ArrayList<>();
        String[] names = {"口红", "包包", "鲜花", "项链", "手表"};
        Random r = new Random();

        for (int i = 0; i < 1000; i++) {
            gift.add(names[r.nextInt(names.length)] + (i + 1));
        }

        System.out.println("礼品列表: " + gift);

        // 定义线程类,创建线程对象。接收gift名单并分发礼物。
        SendThread t1 = new SendThread(gift, "小明");
        t1.start();
        SendThread t2 = new SendThread(gift, "小红");
        t2.start();

        t1.join();//等待上面代码完成,最后统计个数
        t2.join();

        System.out.println( "小明送了"+t1.getCount());
        System.out.println("小红送了"+t2.getCount());


    }
}
public class SendThread extends Thread {
    private List<String> gift;
    private int count = 0;

    public SendThread(List<String> gift, String name) {
        super(name);
        this.gift = gift;
    }


    @Override
    public void run() {
        Random r = new Random();
        while (true) {
            synchronized (gift) {//不使用this锁,而是使用gift锁,因为在调用时候,SendThread用了两次,不唯一
                if (gift.size() < 10) {
                    break;
                }
                // 随机移除一个礼物
                String rs = gift.remove(r.nextInt(gift.size()));
                System.out.println(Thread.currentThread().getName() + " 发送礼物: " + rs);
                count++;
            }
        }
    }

    public void setCount(int count) {
        this.count = count;
    }


    public int getCount() {
        return count;
    }
}

标签:count,String,gift,乐观,SendThread,悲观,new,public
From: https://blog.51cto.com/u_16382144/11945593

相关文章

  • 数据库悲观锁和乐观锁的区别
    前言MySQL本身不直接提供悲观锁(PessimisticLocking)和乐观锁(OptimisticLocking)的实现机制,因为这些锁的概念通常是在应用层面通过不同的策略和工具来实现的。然而,我们可以利用MySQL的一些特性来模拟或支持这两种锁的行为。一、什么是乐观锁和悲观锁?乐观锁(OptimisticLoc......
  • Java并发编程 - 基础(悲观锁与synchronized)(偏向锁、轻量级锁、锁优化)
    Java并发编程中的悲观锁和synchronized关键字,以及Java内存模型中的锁优化机制(如偏向锁、轻量级锁)都是非常重要的概念。下面将详细介绍这些内容。悲观锁(PessimisticLocking)悲观锁假设数据会发生冲突,因此在读取数据时就加锁,以防止其他线程修改数据。这种方式虽然能保......
  • 基于SpringBoot3框架-数据库乐观锁、悲观锁、Redis、Zookeeper分布式锁的简单案例实现
    1.分布式锁的定义分布式锁是一种在分布式系统中用来协调多个进程或线程对共享资源进行访问的机制。它确保在分布式环境下,多个节点(如不同的服务器或进程)不会同时访问同一个共享资源,从而避免数据不一致、资源竞争等问题。2.分布式锁的工作原理分布式锁的工作原理与单机锁......
  • 乐观锁与悲观锁在MySQL中的应用
    本文由ChatMoney团队出品在数据库管理系统中,锁机制是保证数据一致性和并发控制的重要手段。MySQL,作为广泛使用的数据库系统之一,提供了多种锁策略来处理并发访问时可能引发的数据不一致性问题。其中,乐观锁和悲观锁是两种截然不同但又互补的并发控制策略,它们在不同的应用场景下......
  • mysql:使用乐观锁保护数据一致性和完整性
    在数据库操作中,保持数据一致性和完整性至关重要。乐观锁(OptimisticLock)是一种不锁定资源的锁机制,它在数据更新时才会检测是否发生冲突。本文将介绍乐观锁的概念、使用方法、优缺点,并特别罗列它与悲观锁的区别。乐观锁的概念乐观锁基于这样一个假设:数据冲突并不频繁发生,因此在读......
  • mysql:使用悲观锁保护数据完整性
    在数据库操作中,确保数据一致性和完整性至关重要。悲观锁(PessimisticLock)是一种锁机制,它在读取数据时就对其加锁,从而防止其他事务同时修改该数据。本文将介绍悲观锁的概念、使用方法,以及它的优点和缺点。悲观锁的概念悲观锁是一种认为并发操作总会发生冲突的锁机制。当一个事务......
  • 在MySQL中悲观锁及乐观锁的应用
    本文由ChatMoney团队出品在数据库管理系统中,锁机制是保证数据一致性和并发控制的重要手段。MySQL,作为广泛使用的数据库系统之一,提供了多种锁策略来处理并发访问时可能引发的数据不一致性问题。其中,乐观锁和悲观锁是两种截然不同但又互补的并发控制策略,它们在不同的应用场景下......
  • 【杂谈】JPA乐观锁改悲观锁遇到的一些问题与思考
    背景接过一个外包的项目,该项目使用JPA作为ORM。项目中有多个entity带有@version字段当并发高的时候经常报乐观锁错误OptimisticLocingFailureException原理知识JPA的@version是通过在SQL语句上做手脚来实现乐观锁的UPDATEtable_nameSETupdated_column=new_value,vers......
  • gorm中使用乐观锁
    乐观锁简介乐观锁(又称乐观并发控制)是一种常见的数据库并发控制策略。乐观并发控制多数用于数据竞争(datarace)不大、冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,因此可以获得比其他并发控制方法更高的吞吐量。它的作用是防止并发更新数据......
  • 使用PHP实现悲观锁的最佳实践。里面包含源码
    在数据库编程中,确保数据的一致性和完整性是非常重要的。当多个用户或线程同时访问和修改同一条数据记录时,可能会出现并发问题,比如读写冲突、数据丢失等。为了解决这些问题,我们可以使用并发控制机制,其中一种常见的方法就是悲观锁。什么是悲观锁?悲观锁是一种并发控制策......