文章目录
1. 设置超时时间
- 1. 设置超时时间
- 2. 多使用JUC包提供的并发类,而不是自己设计锁
- 3. 尽量降低锁的使用粒度
- 4. 尽量使用同步代码块 而不是同步方法
- 5. 给线程起有意义的名字
- 6. 避免锁的嵌套
- 7. 分配锁资源之前先看能不能收回来资源
- 8. 专锁专用
使用JUC包中的Lock接口提供的tryLock方法. 该方法在获取锁的时候, 可以设置超时时间, 如果超过了这个时间还没拿到这把锁, 那么就可以做其他的事情, 而不是像synchronized
如果没有拿到锁会一直等待下去.
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
造成超时的原因有很多种:发生了死锁, 线程进入了死循环, 线程逻辑复杂执行慢.
到了超时时间, 那么就获取锁失败, 就可以做一些记录操作, 例如 打印错误日志, 发送报警邮件,提示运维人员重启服务等等.
如下的代码演示了 使用tryLock 来避免死锁的案例. 线程1 如果拿到了锁1 , 那么就在指定的800毫秒内去尝试拿到锁2, 如果两把锁都拿到了 , 那么就释放这两把锁. 如果在指定的时间内, 没有拿到锁2 , 那么就释放锁1 .
线程2 与线程1相反, 先去尝试拿到锁2, 如果拿到了, 就去在3s内尝试拿到锁1, 如果拿到了, 那么就释放锁1和2, 如果3s内没有拿到锁1, 那么释放锁2 .
package com.thread.deadlock;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 类名称:TryLockDeadlock
* 类描述: 使用lock接口提供的trylock 避免死锁
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/9/12 17:23
* Version 1.0
*/
public class TryLockDeadlock implements Runnable {
int flag = 1;
//ReentrantLock 为可重入锁
static Lock lock1 = new ReentrantLock();
static Lock lock2 = new ReentrantLock();
public static void main(String[] args) {
// 创建两个线程 给出不同的flag 并启动
TryLockDeadlock r1 = new TryLockDeadlock();
TryLockDeadlock r2 = new TryLockDeadlock();
r1.flag = 1 ;
r2.flag = 0 ;
new Thread(r1).start();
new Thread(r2).start();
}
@Override
public void run() {
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?