多线程扩展:乐观锁、多线程练习

本文通过Java示例,探讨了悲观锁和乐观锁在处理100份礼品并发送出场景中的使用,强调了在多线程环境中如何实现线程安全,以及两种锁策略对性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

悲观锁、乐观锁

悲观锁:一上来就加锁,没有安全感,每次只能一个线程进入访问完毕后,再解锁。线程安全,性能较差。

乐观锁:一开始不上锁,认为是没有问题的,等要出现线程安全问题的时候才开始控制。线程安全,性能较好

练习

需求:

  • 有100份礼品,小明、小红同时发送,当剩下的礼品小于10的时候则不再送出利用多线程模拟该过程并将线程的名称打印出来,并最后在控制台分别打印小红、小明各种送出多少份礼品

Test类

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Test {
    public static void main(String[] args) throws Exception {
        // 目标:有100份礼品,小明、小红同时发送,当剩下的礼品小于10的时候则不再送出
        // 利用多线程模拟该过程并将线程的名称打印出来,并最后在控制台分别打印小红、小明各种送出多少份礼品
        // 拿100分礼品到程序中来
        List<String> gift = new ArrayList<>();
        String[] names = {"口红","包包","鲜花","剃须刀","皮带","手表"};
        Random r = new Random();
        for (int i = 0; i < 100; i++) {
            gift.add(names[r.nextInt(names.length)] + (i+1));
        }
        System.out.println(gift);

        //定义线程类,创建线程对象,去集合中拿礼物给别人
        SendThread xm = new SendThread(gift,"小明");
        xm.start();

        SendThread xh = new SendThread(gift,"小红");
        xh.start();

        xm.join();
        xh.join();

        System.out.println(xm.getCount());
        System.out.println(xh.getCount());
    }
}

SendThread类

import java.util.List;
import java.util.Random;

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

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

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        // 小明、小红发礼物出去
        // 实现线程安全问题
        // 注意1:锁必须唯一
        Random r = new Random();
        while (true){
            synchronized (gift){
                if (gift.size() < 10){
                    break;
                }
                String rs = gift.remove(r.nextInt(gift.size()));
                System.out.println(name + "发出了:" + rs);
                count++;
            }
        }
    }

    public int getCount() {
        return count;
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值