今天学习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