Lock锁
传统Synchronized锁
来看一个多线程卖票例子
java
public class SaleTicketTDemo01 {
/*
*真正的多线程开发,公司中的开发,降低耦合性
*线程就是一个单独的资源类,没有任何附属的操作!
* 1、 属性、方法
*/
public static void main(String[] args) {
//并发:多个线程同时操作一个资源类,把资源类丢入线程
Ticket ticket = new Ticket();
// @FunctionalInterface函数式接口,jdk1.8 lambda表达式
new Thread(() -> {
for (int i = 1; i < 50; i++) {
ticket.sale();
}
}, "A").start();
new Thread(() -> {
for (int i = 1; i < 50; i++) {
ticket.sale();
}
}, "B").start();
new Thread(() -> {
for (int i = 1; i < 50; i++) {
ticket.sale();
}
}, "C").start();
}
}
//资源类OOP
class Ticket {
//属性、方法
private int number = 50;
// 卖票的方式
// synchronized本质: 队列,锁
public synchronized void sale() {
if (number > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了" + (50-(--number)) + "张票,剩余:" + number + "张票");
}
}
}Lock接口



公平锁:十分公平:可以先来后到
非公平锁:十分不公平:可以插队(默认是非公平锁)
java
public class SaleTicketTDemo02 {
public static void main(String[] args) {
//并发:多个线程同时操作一个资源类,把资源类丢入线程
Ticket2 ticket = new Ticket2();
// @FunctionalInterface函数式接口,jdk1.8 lambda表达式
new Thread(() -> {
for (int i = 1; i < 50; i++) {
ticket.sale();
}
}, "A").start();
new Thread(() -> {
for (int i = 1; i < 50; i++) {
ticket.sale();
}
}, "B").start();
new Thread(() -> {
for (int i = 1; i < 50; i++) {
ticket.sale();
}
}, "C").start();
}
}
//Lock 3步骤
// 1. new ReentrantLock();
// 2. lock.lock() 加锁
// 3. lock.unlock() 解锁
class Ticket2 {
//属性、方法
private int number = 50;
Lock lock = new ReentrantLock();
// 卖票方式
public void sale() {
lock.lock();// 加锁
try {
// 业务代码
if (number > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了" +
(50 - (--number)) + "张票,剩余:" + number + "张票");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();// 解锁
}
}
}Synchronized和Lock区别
synchronized是Java内置关键字,Lock是java.util.concurrent.locks包下的接口。synchronized无法主动判断是否获取到锁,Lock可以通过tryLock()尝试获取锁。synchronized会自动释放锁,Lock必须在finally中手动释放锁,否则可能造成死锁。synchronized获取不到锁时只能阻塞等待,Lock可以选择中断等待、限时等待或尝试获取。二者都是可重入锁。
synchronized不可中断,默认是非公平锁;ReentrantLock可以设置公平或非公平,并支持可中断等待。简单同步优先使用
synchronized,需要更灵活的锁控制时使用Lock。