Lock锁
传统synchronized锁
package com.sw;
/**
* @Author suaxi
* @Date 2021/1/4 14:00
*/
public class SaleTicket01 {
public static void main(String[] args) {
Ticket1 ticket1 = new Ticket1();
new Thread(() ->{for (int i = 0; i < 30; i++) ticket1.sale();},"A").start();
new Thread(() ->{for (int i = 0; i < 30; i++) ticket1.sale();},"B").start();
new Thread(() ->{for (int i = 0; i < 30; i++) ticket1.sale();},"C").start();
}
}
//synchronized锁
class Ticket1{
private int num = 30;
public synchronized void sale(){
if (num>0){
System.out.println(Thread.currentThread().getName()+"卖了"+(num--)+"张票,剩余:"+num);
}
}
}
Lock接口
公平锁:先来后到
非公平锁:可以插队(默认使用)
package com.sw;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Author suaxi
* @Date 2021/1/4 11:28
*/
public class SaleTicket02 {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(() ->{for (int i = 0; i < 30; i++) ticket.sale();},"A").start();
new Thread(() ->{for (int i = 0; i < 30; i++) ticket.sale();},"B").start();
new Thread(() ->{for (int i = 0; i < 30; i++) ticket.sale();},"C").start();
}
}
//Lock锁
class Ticket{
private int num = 30;
//1.新建重入锁
Lock lock = new ReentrantLock();
public void sale(){
lock.lock(); //2.加锁
try{ //业务代码
if (num>0){
System.out.println(Thread.currentThread().getName()+"卖了"+(num--)+"张票,剩余:"+num);
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock(); //3.解锁
}
}
}
synchronized与Lock的区别
1、synchronized 是内置的Java关键字;Lock是一个Java类
2、synchronized 无法判断 获取锁 的状态;Lock可以判断
3、synchronized 会自动释放锁;Lock必须手动释放,如果不释放,会产生死锁问题
4、synchronized 线程1(获得锁,阻塞),线程2(一直傻傻的等待);Lock锁就不一定会一直等待下去lock.trylock()
5、synchronized 可重入锁,不可中断,非公平;Lock 可重入锁,可以判断锁的状态,非公平(可自定义公平性)
6、synchronized 适用于锁少量的同步代码问题;Lock 适合大量同步代码问题
评论 (0)