美文网首页
java 锁(Lock)

java 锁(Lock)

作者: qyfl | 来源:发表于2020-02-04 00:00 被阅读0次

    为什么需要 Lock

    synchronized 不够用。

    • 效率低:锁的释放情况少、试图获取锁时不能设定超时、不能中断一个正在试图获得锁的线程。
    • 不够灵活:加锁和释放的时机单一,每个锁仅有单一的条件(某个对象),可能是不够的。
    • 无法知道是否成功获取到锁。

    Lock 用法

    使用一种叫做 ReentrantLock 的具体的锁,在 finally 里释放锁。

    lock 使用

    lock() 方法不能被中断,一旦陷入死锁,就会陷入永久等待。

    public class MustUnlock {
        private static Lock lock = new ReentrantLock();
    
        public static void main(String[] args) {
            lock.lock();
            try {
                // 获取本锁保护的资源
                System.out.println(Thread.currentThread().getName() + "开始执行任务");
            } finally {
                lock.unlock();
            }
        }
    }
    

    tryLock 使用

    tryLock 获取到锁之后,需要在执行完成之后释放。官方建议的方式是使用 try 语句,解锁放在 finally 中。

    public class tryLockDeadLock implements Runnable {
    
        static Lock lock1 = new ReentrantLock();
    
        @Override
        public void run() {
            try {
                if (lock1.tryLock(800, TimeUnit.MILLISECONDS)) {
                    try {
                        System.out.println("线程1 获取到了锁1");
                    } finally {
                        lock1.unlock();
                    }
                } else {
                    System.out.println("线程1 获取锁1失败");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

    Java 锁的分类

    Java 中锁的分类

    乐观锁和悲观锁

    乐观锁:乐观锁认为在一般情况下,一切顺利是常态,所以有事情就去做,如果出了问题再来补救。例如:原子类和并发容器等。

    悲观锁:悲观锁认为,一般强狂下,资源不足,大家都来争抢是常态。如果我不锁住资源,别人就会来抢,就会造成数据的错误。 例如:synchronized 和 Lock 相关的类。

    相关文章

      网友评论

          本文标题:java 锁(Lock)

          本文链接:https://www.haomeiwen.com/subject/tioczctx.html