java同步锁的实现

在开发过程中,我们经常有需要数据保持一致性的要求。比如同一个系统的增删改功能,在同一时间内仅能有一个管理员对其进行操作,从而保证数据的准确性。
那么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();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值