Lock锁与synchronized锁的区别

本文详细对比了Lock锁与synchronized锁的特点与使用方式。Lock锁如ReentrantLock需手动控制开锁与关锁,配合Condition类的await()与signal()方法实现线程同步。而synchronized锁自动管理锁的获取与释放,常与wait()和notify()方法一起使用。

Lock锁与synchronized锁的区别

1、synchronized锁是可以帮助我们自动开锁和关闭锁
2、Lock锁,我们最常用的是ReentrantLock重入锁,需要我们手动的开锁和手动关锁
3、synchronized只能与wait()、notify()方法一起使用
4、ReentrantLock只能与Condition类中的await()、single()方法一起使用

用ReentranLock修改我们上篇文章的生产者和消费者模型

、产品
在这里插入图片描述
、生产者

/**
 * 生产者
 */
class Product extends Thread {
    private int count = 1;
    private User user;

    public Product(User user) {
        this.user = user;
    }

    @Override
    public void run() {
        while (true) {
            try {
                //开锁
                user.getLock().lock();
                if (user.flag) {
                    try {
                        user.getCondition().await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                if (count == 1) {
                    user.setId(1);
                    user.setName("紫炎易霄");
                    user.setAge(21);
                } else {
                    user.setId(6);
                    user.setName("黑袍萧寻");
                    user.setAge(66);
                }
                count = (count + 1) % 2;
                user.flag = true;
                //唤醒另一个线程
                user.getCondition().signal();
            } catch (Exception e) {
                e.getStackTrace();
            } finally {
                //释放锁
                user.getLock().unlock();
            }

        }
    }
}

、消费者

/**
 * 消费者
 */
class Consumer extends Thread {
    private User user;

    public Consumer(User user) {
        this.user = user;
    }

    @Override
    public void run() {
        while (true) {
            try {
                user.getLock().lock();
                //上锁
                if (!user.flag) {
                    try {
                        user.getCondition().await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(user);
                user.flag = false;
                //唤醒生产者线程
                user.getCondition().signal();
            } catch (Exception e) {
                e.getStackTrace();
            } finally {
                //释放锁
                user.getLock().unlock();
            }
        }
    }
}

、运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值