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

[复制链接]
发表于 2023-12-1 04:19:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Lock锁(重点)

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

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

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

三部曲
1、创建一个锁
  1. Lock lock = new ReentrantLock(true);
复制代码
2、加锁
  1. lock.lock();
复制代码
3、将业务代码块包裹在try{}cath(){}finally{lock.unlock();}中
  1. try {
  2.             if (number>0){
  3.                 System.out.println(Thread.currentThread().getName()+":卖出了第"+ number-- +"张票;"+"剩余"+number+"张票");
  4.             }
  5.         }catch (Exception e){
  6.             e.printStackTrace();
  7.         }finally {
  8.             lock.unlock();
  9.         }
复制代码
完整给一个业务加锁
  1. class Ticket2{    private int number = 50;    Lock lock = new ReentrantLock(true);    public void sale(){        lock.lock();        try {
  2.             if (number>0){
  3.                 System.out.println(Thread.currentThread().getName()+":卖出了第"+ number-- +"张票;"+"剩余"+number+"张票");
  4.             }
  5.         }catch (Exception e){
  6.             e.printStackTrace();
  7.         }finally {
  8.             lock.unlock();
  9.         }    }}
复制代码
公平锁结果

非公平锁结果

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

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

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

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表