Lock锁

suaxi
2021-01-06 / 0 评论 / 66 阅读 / 正在检测是否收录...

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接口

1.公平锁非公平锁.png

公平锁:先来后到

非公平锁:可以插队(默认使用)

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

评论 (0)

取消