首页 > 基础资料 博客日记

JUC并发编程学习笔记(二)Lock锁(重点)

2023-11-02 18:49:53基础资料围观230

本篇文章分享JUC并发编程学习笔记(二)Lock锁(重点),对你有帮助的话记得收藏一下,看Java资料网收获更多编程知识

Lock锁(重点)

传统的synchronized

传统的解决多线程并发导致的一些问题我们会使用synchronized关键字来解决,synchronized的本质就是队列、锁。


Lock的实现类有:可重复锁(最常用)、读锁、写锁

在创建可重复锁时,可传入boolean类型值来决定该锁是公平锁(先来后到)还是非公平锁(可插队)。

三部曲

1、创建一个锁

Lock lock = new ReentrantLock(true);

2、加锁

lock.lock();

3、将业务代码块包裹在try{}cath(){}finally{lock.unlock();}中

try {
            if (number>0){
                System.out.println(Thread.currentThread().getName()+":卖出了第"+ number-- +"张票;"+"剩余"+number+"张票");
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }

完整给一个业务加锁

class Ticket2{
    private int number = 50;
    Lock lock = new ReentrantLock(true);

    public void sale(){
        lock.lock();
        try {
            if (number>0){
                System.out.println(Thread.currentThread().getName()+":卖出了第"+ number-- +"张票;"+"剩余"+number+"张票");
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
}

公平锁结果

非公平锁结果

从结果上看,非公平锁和synchronized关键字效果一样。

  • 小知识:for循环中的业务逻辑只有一条的时候可以简化大括号,直接将业务逻辑卸载后面通过分号结束。

synchronized和Lock锁的区别

  1. synchronized是关键字,Lock锁是java的一个类
  2. synchronized无法判断锁的状态,Lock锁可以判断是否获取到了锁
  3. synchronized是自动的,执行完之后会自动释放锁;Lock锁必须要手动释放锁!如果不释放锁,会导致死锁
  4. synchronized 线程1(获得锁,阻塞)、线程2(等待,傻等死等);Lock锁在其他线程获得锁阻塞后不一定会一直等待下去。可以通过tryLock来尝试获得锁。
  5. synchronized 可重入锁,不可以中断,非公平锁;Lock 可重入锁,可以判断锁、可以自己设置是否公平
  6. synchronized 适合锁少量的代码同步问题;Lock 适合锁大量的代码同步

文章来源:https://www.cnblogs.com/nhgtx/p/17805951.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云