1.复习synchronized
synchronized是Java关键字,可以作用于方法和代码块
2.sunchronized和Lock的区别
1.synchronized是Java关键字,在JVM层面实现加锁和解锁;Lock是一个接口,在代码层面实现加锁和解锁。
2.synchronized可以作用在代码块、方法上;Lock只能写在代码里
3.synchronized在代码执行完或出现异常时自动释放锁;Lock不会自动释放锁,需要在finally中显示释放锁
4.synchronized会导致线程一直拿不到锁而等待,Lock可以设置获取锁失败的超时时间
5.synchronized无法得知是否获取锁成功,Lock则可以通过tryLock得知加锁是否成功
6.synchronized锁可重入、不可中断、非公平;Lock锁可重入、可中断、可公平、不公平,并可以细分读写锁以提高效率。
3.什么是Lock接口
Lock接口是两大锁的根接口之一,Lock代表实现类是ReetrantLock(可重入锁)
4.使用Lock接口实现卖票例子
package com.company.lock; import java.util.concurrent.locks.ReentrantLock; public class LSaleTicket { public static void main(String[] args) { Ticket ticket = new Ticket(); // 用lambda表达式创建三个线程 new Thread(()->{ for (int i = 0;i < 40;i++){ ticket.sale(); } },"售货员1").start(); new Thread(()->{ for (int i = 0;i < 40;i++){ ticket.sale(); } },"售货员2").start(); new Thread(()->{ for (int i = 0;i < 40;i++){ ticket.sale(); } },"售货员3").start(); } } // 创建一个资源类 class Ticket { private int number = 30; // new一个可重入锁 private final ReentrantLock reentrantLock = new ReentrantLock(); public void sale(){ // 一进来就上锁 reentrantLock.lock(); try{ if(number > 0){ System.out.println(Thread.currentThread().getName()+"正在卖票---当前票有:"+number--+"张--剩余:"+number+"张"); } }finally { // 操作完之后就解锁 reentrantLock.unlock(); } } }