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

打印 上一主题 下一主题

主题 895|帖子 895|积分 2685

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 适合锁大量的代码同步

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天空闲话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表