根据b站UP主狂神说JUC课程所写的个人学习笔记
视频地址:https://www.bilibili.com/video/BV1B7411L7tE?from=search&seid=14761503393031794075
传统Synchronized
Lock接口
公平锁十分公平,可以先来后到
非公平锁,可以插队(默认)
lock三部曲:
1.
new ReentrantLock()
2.lock.lock()加锁
3.finally里解锁,业务代码放入try
public class SellTicket2 { public static void main(String[] args) { Ticket2 ticket = new Ticket2(); new Thread(()->{ for (int i = 0; i < 30; i++) { ticket.sell(); } },"A").start(); new Thread(()->{ for (int i = 0; i < 30; i++) { ticket.sell(); } },"B").start(); new Thread(()->{ for (int i = 0; i < 30; i++) { ticket.sell(); } },"C").start(); } } //资源类 oop class Ticket2{ private int number = 30; Lock lock = new ReentrantLock(); //买票的方式 public void sell(){ lock.lock();//加锁 try{ if (number >0){ System.out.println(Thread.currentThread().getName()+"卖出了第"+number--+"张票,剩余"+number); } } catch (Exception e){ e.printStackTrace(); }finally { lock.unlock(); } } }
synchronized和lock的区别
1.synchronized是内置的java关键字,lock是一个关键类
2.synchronized无法判断获取锁的状态,lock可以判断是否获得锁
3.synchronized会自动释放锁,lock必须手动释放锁,不释放锁会产生死锁
4.synchronized 线程1获得锁阻塞、线程2等待;lock锁就不一定会等待下去
lock.tryLock()
5.synchronized 可重入锁,不可中断的,非公平;lock,可重入锁,可以判断锁,非公平(可以自己设置)
6.synchronized 适合锁少量的代码同步问题,lock适合锁大量的同步代码