Lock
实现提供比使用synchronized
方法和语句可以获得的更广泛的锁定操作。 它们允许更灵活的结构化,可能具有完全不同的属性,并且可以支持多个相关联的对象Condition
1、传统的synchronized
package cn.dczh.juc;
/**
* @ClassName: MaipiaoDemo1
* @description: 买票案例 synchronized版本
* @author:
* @date: 2022/3/16 20:39
* @version: 1.0
*/
public class MaipiaoDemo1 {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(() -> { for (int i = 1; i < 40; i++) ticket.sale(); }, "A").start();
new Thread(() -> { for (int i = 1; i < 40; i++) ticket.sale(); }, "B").start();
new Thread(() -> { for (int i = 1; i < 40; i++) ticket.sale(); }, "C").start();
}
}
class Ticket {
private int number = 50;
//synchronized 本质: 排队 锁 非公平
//锁 对象 Clazz
public synchronized void sale() {
if (number > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了" + (number--) + "票,剩余" + number);
}
}
}
Lock接口
Lock接口
package cn.dczh.juc;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @ClassName: MaipiaoDemo2
* @description: 买票案例 lock版本
* @author:
* @date: 2022/3/16 21:00
* @version: 1.0
*/
public class MaipiaoDemo2 {
public static void main(String[] args) {
Ticket2 ticket = new Ticket2();
new Thread(() -> {
for (int i = 1; i < 40; i++) ticket.sale();
}, "A").start();
new Thread(() -> {
for (int i = 1; i < 40; i++) ticket.sale();
}, "B").start();
new Thread(() -> {
for (int i = 1; i < 40; i++) ticket.sale();
}, "C").start();
}
}
//Lock
class Ticket2 {
private int number = 30;
Lock lock = new ReentrantLock();
//锁 对象 Clazz
public void sale(){
try {
//加锁
lock.lock();
if (number > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了" + (number--) + "票,剩余" + number);
}
}catch (Exception e){
e.printStackTrace();
}finally {
//解锁
lock.unlock();
}
}
}
synchionized与lock的区别?
- synchronized是java关键字,lock是一个java类;
- synchronized无法判断锁的状态,lock可以判断是否获取到锁
- synchronized会自动释放锁,lock必须要手都释放锁 ,不释放锁会造成死锁;
- synchronized线程1(获得锁,等待)、线程2(等待、傻傻等),lock就不一定等待 lock.trylock();
- synchronized可重入锁、不可中断、非公平,lock可重入锁,可以判断锁,非公平锁(可以自己设置);