面试必问-工作必用-Java中Lock

88 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

Java中常用的锁有哪些

synchronized和lock

他们有什么区别

  • synchronized再获得锁后自动释放、代码块中有异常也会释放锁 、 一个线程持有锁其他线程必须等待
  • lock:手动释放锁,可以设置锁的超时时间,再超时时间内没有获取锁就进入 catch 中 这篇文章写的很不错,可以借鉴一下

Lock 他是个接口 具体有那些实现类呢!

 ReentrantLock
 Condition
 ReadWriteLock

写一个的简单的应用代码,以ReentrantLock为例、随后再做源码分析

基本语法:且必须这么写 不然会造成线程阻塞

/**
不是我说这么写 是官方给出这么写的
 *
 *  <pre> {@code
 * Lock l = ...;
 * l.lock();
 * try {
 *   // access the resource protected by this lock
 * } finally {
 *   l.unlock();
 * }}</pre>
**/
private void LockReentrantLock() {
    lock.lock();
    try {
        
    } finally {
        lock.unlock();  
    }
}

测试Dome

/**
 * 功能描述:玩Lock
 *
 * @author Songxianyang
 * @date 2022-05-30 20:50
 */
public class LockTest {
    
   private ReentrantLock lock = new ReentrantLock();
    
    public static void main(String[] args) {
        LockTest lockTest = new LockTest();
        new Thread(()->{
            lockTest.lockReentrantLock();
        }).start();
    }
    
    private  void lockReentrantLock() {
        lock.lock();
        try {
            System.out.println("我获取这这把锁---哈哈  开心"+Thread.currentThread().getName());
        } finally {
            lock.unlock();
        }
    
    }
}

结果打印

image.png

Lock接口中有那些必要方法

public interface Lock {

      //上锁
    void lock();

除非当前线程被中断,否则获取锁。
如果可用,则获取锁并立即返回。
如果锁不可用,则当前线程将被禁用以用于线程调度目的并处于休眠状态,直到发生以下两种情况之一:
锁被当前线程获取;或者
其他一些线程中断当前线程,支持获取锁的中断。
如果当前线程:
在进入此方法时设置其中断状态;或者
获取锁时中断,支持获取锁中断,
    void lockInterruptibly() throws InterruptedException;
仅当调用时它是空闲的时才获取锁。
如果锁可用,则获取锁并立即返回值为true 。如果锁不可用,则此方法将立即返回值falseboolean tryLock();
如果在给定的等待时间内空闲并且当前线程没有被中断,则获取锁。
如果锁可用,则此方法立即返回值true 。如果锁不可用,则当前线程将被禁用以用于线程调度目的并处于休眠状态,直到发生以下三种情况之一

    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
释放锁
    void unlock();

    Condition newCondition();
}

image.png