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

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。JUC并发编程学习笔记(二)Lock锁(重点),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

Lock锁(重点)

传统的synchronized

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

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

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

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

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

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

三部曲

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();
        }
    }
}

公平锁结果

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

非公平锁结果

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

从结果上看,非公平锁和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.bmabk.com/index.php/post/199848.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!