Java多线程中 lock()和trylock()方法的区别总结

今天学习Java核心技术中的多线程锁总结一下lock()和tryLock()方法的区别,经过学习以及代码实践得出以下结论:

个人认为这俩方法主要区别就两个:

1.lock()方法:

线程1在执行lock()方法未获得锁的时候,线程1的lock()方法会一直阻塞,直到获得锁。

tryLock():

如果线程2执行tryLock()方法时未获得锁,则会立即返回false,不会阻塞(此方法可设置获得锁的等待时间)

2.lock()方法:

如果线程1在执行lock()方法时被阻塞(因为在等待获得锁),且当前线程此时被中断,则lock()方法仍然会继续阻塞,直到获得锁继续执行。

tryLock():

如果线程2在执行tryLock()方法时等待获得锁(设置等待时间等待获得锁),且线程2此时被中断,则tryLock()方法会抛出异常InterruptedException。

简而言之就是: 1.lock()方法会阻塞,tryLock()方法不会阻塞,在一定时间内一定返回结果

2.lock()方法在当前线程被中断时不会抛出异常,tryLock()在当前线程被中断时会抛出异常

下面是个人的代码实践,主要是针对区别2进行的实验:

 
/**
 * lock()和tryLock()
 *
 */
@Slf4j
public class Demo14513 {
 
    private static Lock myLock = new ReentrantLock();
    private static Lock myLock2 = new ReentrantLock();
 
    /**
     * tryLock()
     */
    @Test
    public void Test1() {
        Runnable runnable = () -> {
            // 此方法未获得锁会立即返回,不会使当前线程休眠,lock()会使线程休眠
            try {
                // 相当于获得锁的最大延迟等待时间
                if (myLock.tryLock(5000, TimeUnit.MILLISECONDS)) {
                    try {
                        log.info("当前线程获得锁");
                        Thread.sleep(500);
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        log.info("当前线程解锁");
                        myLock.unlock();
                    }
                } else {
                    log.info("执行其他替代方法");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
 
        };
 
        for (int i = 0; i < 9; i++) {
            Thread thread = new Thread(runnable);
            thread.start();
            // 中断线程,当前线程被中断 tryLock()方法执行时会抛出异常
            thread.interrupt();
        }
 
        try {
            log.info("主线程休眠");
            Thread.sleep(40000);
            log.info("主线程休眠结束");
 
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * lock()
     */
    @Test
    public void Test2(){
        // 测试lock()方法
        Runnable runnable2 = () -> {
            try {
                myLock2.lock();
                log.info("当前线程获得锁myLock2");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                log.info("当前线程解锁myLock2");
                myLock2.unlock();
            }
        };
 
        for (int i = 0; i < 9; i++) {
            Thread thread = new Thread(runnable2);
            thread.start();
            // 中断线程,当前线程被中断 lock()方法会继续阻塞直到获得锁
            thread.interrupt();
        }
 
        try {
            log.info("主线程休眠");
            Thread.sleep(40000);
            log.info("主线程休眠结束");
 
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
 
}
以下是Test1执行的结果

 

以下是Test2执行的结果


————————————————
版权声明:本文为CSDN博主「大宝58373」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_58576965/article/details/125844752

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值