Java多线程之synchronized和lock

一、synchronized同步关键字

Java 中的同步块用 synchronized 标记。同步块在 Java 中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。所有其他等待进入该同步块的线程将被阻塞,直到执行该同步块中的线程退出

  1. 同步方法
    同步方法,锁当前对象,即this
class BuyTickets implements Runnable {
    private int Tickets = 10;

    @SneakyThrows
    public synchronized void run() {//同步方法,锁当前对象,即this
        while (true) {
            if (Tickets > 0) {
                System.out.println(Tickets--);
                Thread.sleep(1000);
            } else {
                System.out.println("售罄");
                break;
            }
        }
    }
}
  1. 同步块:‘
    同步块,可以锁需要增删改的对象
class BuyTickets implements Runnable {
    private int Tickets = 10;
    
    @SneakyThrows
    public void run() {
        synchronized (this){
        //同步块,可以锁需要增删改的对象,因为此例子中就是改当前对象,所以用this
            while (true) {
                if (Tickets > 0) {
                    System.out.println(Tickets--);
                    Thread.sleep(1000);
                } else {
                    System.out.println("售罄");
                    break;
                }
            }
        }
    }
}

二、Lock接口实现同步锁

常用ReentrantLock(可重入锁)来使用,其实现了Lock接口

class BuyTickets implements Runnable{
    private int Tickets=10;
    private final ReentrantLock lock= new ReentrantLock();
    @SneakyThrows
    public void run() {
        try {
            lock.lock();//加锁
            while (true){
                if (Tickets>0){
                    System.out.println(Tickets--);
                    Thread.sleep(1000);
                }else {
                    System.out.println("售罄");
                    break;
                }
            }
        } finally {
            lock.unlock();//解锁
        }
    }
}

三、Synchronized和Lock对比

  • Synchronized是Java内置的关键字;Lock是Java的一个类
  • Synchronized无法获取锁得状态;Lock可以判断是否获取了锁
  • Synchronized会自动释放锁;Lock必须要手动释放锁,不释放可能死锁
  • Synchronized线程1(获取锁),线程2(等待);Lock锁不一定会等待下去(trylock方法)
  • Synchronized可重入锁,不可以中断,非公平;Lock可重入锁,可以判断锁,可以公平与非公平
  • Synchronized适合锁少量代码块同步问题;Lock可以适用于大量代码块同步问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值