java同步锁的实现
程序员文章站
2022-05-29 07:58:34
...
在开发过程中,我们经常有需要数据保持一致性的要求。比如同一个系统的增删改功能,在同一时间内仅能有一个管理员对其进行操作,从而保证数据的准确性。
那么java项目中为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLock或Synchronized)进行互斥控制。
下面主要涉及到ReentrantLock的用法,ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally中声明释放锁。
此处添加了工具类,根据需求新增了加锁解锁方法,获取锁失败或成功都会返回结果,保证了程序不会死锁。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockUtils {
public static final Lock lock = new ReentrantLock();
public static boolean LOCK_FLAG = false; //为false表示锁未被占用
//加锁,判断当前锁状态
public static boolean insert() {
if (!LOCK_FLAG) {
LOCK_FLAG = true;
lock.lock();
return true;
} else {
return false;
}
}
public static void insertunlock() {
LOCK_FLAG = false;
lock.unlock();
}
}
在程序中调用加锁解锁方法的实例,为保证程序不会出现卡死情况,配合使用try-catch方法,可将解锁调用写在finally代码块中。程序未获取到锁,给出用户提示,避免死锁等待。
boolean lockFlag = ReentrantLockUtils.insert();
if(!lockFlag){
resultMap.put("msg", "程序正在执行其他操作,请稍后重试!");
return resultMap;
} else {
try {
//需要执行的方法
} catch (Exception e) {
e.printStackTrace();
} finally {
ReentrantLockUtils.insertunlock();
}
}
上一篇: ubuntu配置jupyter