文档章节

单机对象锁

rockingMan
 rockingMan
发布于 2018/03/09 18:28
字数 185
阅读 8
收藏 0
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created with IntelliJ IDEA.
 * Description: 单机锁
 * User: jun.lei@counect.com
 * Date: 2018-01-10
 * Time: 10:56
 */
public class LockUtil {
    
    private static final ConcurrentHashMap<Object, ReentrantLock> lockConcurrentHashMap = new ConcurrentHashMap<>();
    
    public static boolean isLock(Object key) {
        return lockConcurrentHashMap.containsKey(key) && lockConcurrentHashMap.get(key).isLocked();
    }
    
    public static boolean tryLock(Object key,
                                  long time,
                                  TimeUnit timeUnit) {
        ReentrantLock lock = getLock(key);
        if (null == lock) {
            lock = lockConcurrentHashMap.get(key);
        }
        try {
            return lock.tryLock(time, timeUnit);
        } catch (Exception e) {
            return false;
        }
    }
    
    public static void lock(Object key) throws InterruptedException {
        ReentrantLock lock = getLock(key);
        if (null == lock) {
            lock = lockConcurrentHashMap.get(key);
        }
        lock.lockInterruptibly();
    }
    
    public static void unlock(Object key) {
        ReentrantLock lock = getLock(key);
        if (null != lock) {
            lock.unlock();
            if (!lock.hasQueuedThreads()) {
                lockConcurrentHashMap.remove(key);
            }
        }
    }
    
    private static ReentrantLock getLock(Object key) {
        return lockConcurrentHashMap.putIfAbsent(key, new ReentrantLock());
    }
    
    public static void main(String[] args) {
        //等待获取锁 或线程被打断
        try {
            LockUtil.lock("123");
            try {
                //biz code
            } finally {
                LockUtil.unlock("123");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        //尝试等待获取锁 或线程被打断
        if (LockUtil.tryLock("456", 5, TimeUnit.SECONDS)) {
            try {
                //biz code
            } finally {
                LockUtil.unlock("456");
            }
        }
    
    }
}

© 著作权归作者所有

rockingMan
粉丝 11
博文 15
码字总数 3347
作品 0
合肥
后端工程师
私信 提问
Redis实现分布式锁

一、分布式锁是啥? 单机锁的概念:我们正常跑的单机项目(也就是在tomcat下跑一个项目不配置集群)想要在高并发的时候加锁很容易就可以搞定,java提供了很多的机制例如:synchronized、vol...

刺風
2017/10/16
0
0
Hibernate 乐观锁和悲观锁

悲观锁:对外界操作数据持保守态度。认为一定会发生数据不一致的问题。 悲观锁依靠数据库本身的锁机制。 1.JDBC采用for update 语句: eg:select * from tb where id="id" for update; 2.Hi...

古怪945
2015/06/22
22
0
[原创]商城系统下单库存管控系列杂记(二)(并发安全和性能部分延伸)

商城系统下单库存管控系列杂记(二)(并发安全和性能部分延伸) 前言 参与过几个中小型商城系统的开发,随着时间的增长,以及对系统的深入研究和测试,发现确实有很多值得推敲和商榷的地方(...

autumnbing
2017/11/13
0
0
Spring-AOP防重解决方案

思路如下: 1、自定义注解 @NoRepeatSubmit 标记有必要防重复提交请求Controller。 2、通过Spring-AOP方式对所有标记了 @NoRepeatSubmit 的方法进行切入拦截。 3、在业务方法执行前,获取当前...

铁骨铮铮
05/21
30
0
Java程序员如何运用所掌握的技术构建一个完整的业务架构

1、通用架构概述 创业之初,我们往往会为了快速迭代出产品,而选择最简单的技术架构,比如LAMP架构,SSH三层架构。这些架构可以适应初期业务的快速发展,但是,随着业务变得越来越复杂,我们...

java高级架构牛人
2018/04/25
68
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
279
6
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部