Lock 锁
Lock锁(重点)
传统的synchronized
/**
* 基本买票例子
* 线程就是一个单独的资源类,没有任何附属的操作
* 1、属性、方法
*/
public class SaleTicketDemo01 {
public static void main(String[] args) {
//并发:多线程操作同一个资源类,把资源类丢入线程
Ticket ticket = new Ticket();
//@FunctionalInterface函数式接口,jdk1.8之后lambda表达式(参数)->{代码}
new Thread(()->{
for (int i = 1; i < 60; i++) {
ticket.sale();
}
},"A").start();
new Thread(()->{
for (int i = 1; i < 60; i++) {
ticket.sale();
}
},"B").start();
new Thread(()->{
for (int i = 1; i < 60; i++) {
ticket.sale();
}
},"C").start();
}
}
//资源类
class Ticket {
// 属性、方法
private int number = 50;
//买票的方式
//synchronized:本质,队列,锁
//锁对象和class
public synchronized void sale() {
if (number > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了第" + number-- + "张票,剩余:"+number);
}
}
}
Lock 接口
公平锁:十分公平:先来后到
非公平锁:十分不公平:可以插队(默认)有时会先执行在后的执行时间少的。
public class SaleTicketDemo02 {
public static void main(String[] args) {
Ticket2 ticket2 = new Ticket2();
new Thread(()->{
for (int i = 1;i < 40; i++) ticket2.sale();
},"A").start();
new Thread(()->{
for (int i = 1;i < 40; i++) ticket2.sale();
},"B").start();
new Thread(()->{
for (int i = 1;i < 40; i++) ticket2.sale();
},"C").start();
}
}
//资源类
//Lock
class Ticket2 {
private int number = 30;
Lock lock = new ReentrantLock();
public void sale() {
lock.lock();//加锁
try {
//业务代码
if (number > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了第" + number-- + "张票,剩余:"+number);
}
} catch (Exception e) {
} finally {
lock.unlock();
}
}
}
Synchronized 和 Lock 区别
1、Synchronized 是内置的Java关键字,Lock是一个Java类
2、Synchronized 无法判断获取锁的状态,Lock 可以判断是否获取到了锁
3、Synchronized 会自动释放锁,Lock 必须要手动释放锁!如果不释放锁,会死锁
4、Synchronized 线程1(获得锁,阻塞)、线程2(等待,傻傻的等待);Lock锁就不一定会等待下去。
5、Synchronized 可重入锁(可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁),不可以中断的,非公平。Lock,可重入锁,可以判断锁,非公平(可以自设置)。
6、Synchronized 适合少量的代码同步问题,Lock适合锁大量的同步代码!
锁是什么,如何判断锁的是谁
本作品采用《CC 协议》,转载必须注明作者和本文链接