tryLock 和Lock 和 lockinterruptibly 的区別

tryLock 和Lock 和 lockinterruptibly 的区別
1.tryLock 能获得锁就返回 true,不能就立即返回 false,tryLock(longtimeout,TimeUnit unit),可以增加时间限制,如果超过该时间段还没获得锁,返回 false
2lock能获得锁就返回true,不能的话一直等待获得锁
3.lock 和lockInterruptibly,如果两个线程分别执行这两个方法,但此时中断这两个线程,lock不会抛出异常,而lockInterruptibly 会抛出异常。

第3条小demo案例演示:

package com.coding.webflux.demo;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.ReentrantLock;

public class DemoThread {

    private ReentrantLock lock = new ReentrantLock();
    private final CountDownLatch latch = new CountDownLatch(1);

    public static void main(String[] args) throws InterruptedException {
        DemoThread demoThread = new DemoThread();
        // 当前线程持有锁,其他线程抢锁期间,lock不会抛中断异常,但是lockInterruptibly抛异常
        new Thread(() -> demoThread.method0()).start();

        // Thread thread = new Thread(() -> demoThread.method1());
        Thread thread = new Thread(() -> demoThread.method2());
        thread.start();
        Thread.sleep(1000);
        thread.interrupt();
        System.out.println("OK");
    }

    /**
     * 使用线程持有锁
     */
    private void method0() {
        try {
            lock.lock();
            Thread.sleep(9999999999L);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    /**
     * 可中断的抢锁
     */
    private void method1() {
        try {
            lock.lockInterruptibly();
            for (int i = 0; i < 10000000; i++) {
                if (i == 5) {
                    latch.countDown();
                }
                System.out.println(".");
            }
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        } finally {
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
    }

    /**
     * 不可中断的抢锁
     */
    private void method2() {
        try {
            lock.lock();
            for (int i = 0; i < 10000000; i++) {
                if (i == 5) {
                    latch.countDown();
                }
                System.out.println(".");
            }
        } catch (Throwable throwable) {
            System.out.println(throwable.getMessage());
        } finally {
            // 判断当前线程是否占用该锁
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
    }


}

posted on   ~码铃薯~  阅读(49)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示