首页 > 其他分享 >synchronized使用String做锁定互斥

synchronized使用String做锁定互斥

时间:2023-10-30 09:33:05浏览次数:33  
标签:ConcurrentHashMap String synchronized private 互斥 static key import

依靠ConcurrentHashMap特性,自己实现一个工厂类:

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

@Slf4j
public class MutexFactory {

    private static final String DEFAULT_KEY = "default";

    /**
     * 依靠ConcurrentHashMap的特性来实现互斥
     **/
    private static ConcurrentMap<String, Mutex> globalMutexMap = new ConcurrentHashMap<>();

    private MutexFactory() {

    }

    public static Mutex getMutex(String key) {
        String finalKey = handleKey(key);
        return globalMutexMap.compute(key, (k, v) -> (v == null) ? new Mutex(finalKey) : v);
    }

    private static String handleKey(String key) {
        if (StringUtils.isEmpty(key)) {
            return DEFAULT_KEY;
        } else {
            return key;
        }
    }

    @Data
    static class Mutex {
        private String value;

        public Mutex(String value) {
            this.value = value;
        }
    }
}

使用:

synchronized (MutexFactory.getMutex(key)){
    System.out.println("handle:" +key);
}

 

标签:ConcurrentHashMap,String,synchronized,private,互斥,static,key,import
From: https://www.cnblogs.com/xfeiyun/p/17797077.html

相关文章

  • go string
    strings.TrimSpace(strstring):去掉字符串首尾空白字符strings.Trim(strstring,cutstring):去掉字符串首尾cut字符strings.TrimLeft(strstring,cutstring):去掉字符串首cut字符strings.TrimRight(strstring,cutstring):去掉字符串首cut字符strings.Field(strstring):返回str......
  • go string
    字符串替换: strings.Replace(strstring,oldstring,newstring,nint)字符串计数: strings.Count(strstring,substrstring)int重复count次str: strings.Repeat(strstring,countint)string转为小写: strings.ToLower(strstring)string转为大写: stri......
  • string的相关用法
    string的相关用法一、string对象初始化  常见的初始化有两种方式:拷贝初始化和直接初始化。点击查看代码strings1="hello";//拷贝初始化strings2("world");//直接初始化strings3(10,c);//十个c,cccccccccc二、string对象的运算 string运算左右位必须要有一个str......
  • 用HashMap创建jString,ArrayList的键值对用entrySet遍历
    用HashMap创建jString,ArrayList的键值对用entrySet遍历package随机点名器;importjava.util.*;publicclassTest1{publicstaticvoidmain(String[]args){HashMap<String,ArrayList<String>>m=newHashMap<>();ArrayList<String>......
  • c++恶心的char和string
    统计数字出现次数。Char的长度Strlen(char) string的长度.size()函数与.length()Char和string都可以==比较。注意stringa=”1adbcde”,而a[0]是char类型需要转换。 #include<bits/stdc++.h>#include<string>usingnamespacestd;intmain(){intn;charx;cin>>......
  • SP10570 LONGCS - Longest Common Substring
    SP10570LONGCS-LongestCommonSubstring更好的阅读体验提供一个后缀数组解法。多字符串,中间加分隔符然后后缀排序求出\(sa\)和\(height\)。把每个字符串对应的位置染上颜色,问题变为寻找\(i,j\)使得区间\([i,j]\)包含\(n\)种颜色并且\(\min_{k=i+1}^{j}height_k\)......
  • Spring @ConfigurationProperties Yaml语法配置List和Map:List<String>、List<Obj>、L
    yaml语法数据结构可以用类似大纲的缩排方式呈现,结构通过缩进来表示,连续的项目通过减号“-”来表示,map结构里面的key/value对用冒号“:”来分隔。例子:配置类YmalConfig:importcn.hutool.json.JSONUtil;importlombok.Data;importorg.springframework.boot.context.properti......
  • 优雅的使用String字符串处理各种类型转换
    (文章目录)......
  • String和StringBuffer的区别
    String和StringBuffer是Java中两种用于处理字符串的不同类,它们之间有一些重要的区别。 可变性:String 是不可变的(immutable):一旦创建了一个 String 对象,就不能更改它的内容。每次对 String 进行修改操作(例如拼接字符串),都会创建一个新的 String 对象。这可能会导致......
  • Easy Excel 导出存在绿色角标问题[返回字段类型是数字,当时使用String来接收]
     一、背景EasyExcel导出,发现excel存在大量的绿色角标,很影响美观,如果个人使用可以设置wps或office忽略检测警告,但是我是对业主的,所以这一方式对我不适用,只能通过代码的方式解决. 二、实现通过以下创建一个 ExcelWriter,实现去绿色角标的关键是使用easyExc......