java使用ConcurrentHashMap和计数器实现锁的方法
java如何使用ConcurrentHashMap和计数器实现锁?下面是由本站小编为大家整理的java使用ConcurrentHashMap和计数器实现锁的方法,喜欢的可以收藏一下!了解更多详情资讯,请关注应届毕业生考试网!
java 使用ConcurrentHashMap和计数器实现锁
在某些场景下,我们想让线程根据某些业务数据进行排队,简单代码如下:
import yList;
import Map;
import ;
import ;
import urrentHashMap;import icInteger;public class TestServiceImpl {private static ConcurrentHashMap<Long, LockObj> lockMap = new ConcurrentHashMap<Long, LockObj>(40);public void test(Long userId){LockObj lock = tryLock(userId);
synchronized (lock) {
try{
//处理业务
}
finally{
unLock(lock);
}
}
}
private LockObj tryLock(Long key) {
LockObj curVal = new LockObj(key);
LockObj preVal = fAbsent(key, curVal);if (null == preVal) {();
return curVal;
}
else{
();
}
return preVal;
}
private void unLock(LockObj lock){
if (() <= 0){
ve(ey());
}
}
public class LockObj {
private long key = 0;
private AtomicInteger count = new AtomicInteger(0);public LockObj(long key){ = key;
}
public int inc(){
return ementAndGet();
}
public int dec(){
return ementAndGet();
}
public long getKey(){
return key;
}
@Override
public String toString() {
return "LockObj [key=" + key + ", count=" + count + "]";}
}
}
按照userId来排队,如果每个线程处理数据后不释放锁的`话,那么可以不利用计数器。但是加了释放锁的操作,则必须加上计算器。因为当线程把锁释放掉后,还没来得及退出synchronized 代码块时,另外一个线程调用了tryLock方法,那该线程将拿到另外一个对象的锁,导致利用synchronized 关键字进行userId排队失败。
也可以利用guava的API来实现。
import rner;import rners;public class TestServiceImpl {Interner<String> pool = eakInterner();public void test(Long userId) throws OspException {synchronized ( rn(eOf(userId))){//处理业务操作}
}
}
-
在Java里处理文件的技巧
导读:看到太多的凌乱的,不安全的处理文件的代码了。可以说每个项目都会有人喜欢写自己的一些FileUitl。下面是小编为大家整理的在Java里处理文件的技巧,欢迎参考~实用的工具类,Path,Paths,Files,FileSystem有一些很灵活的处理方法://得到一个Path对象Pathpath=("/test/...
-
全面理解java中的异常处理机制精选
一、java异常总结:异常就是程序运行时出现不正常运行情况1.异常由来:通过java的类的形式对现实事物中问题的描述,并封住成了对象其实就是java对不正常情况描述后的对象体现2.对于问题的划分有两种:一种是严重的问题,一种是非严重的问题对于严重的,java通过Error类来...
-
Java多线程知识点
引导语;多线程是指从软件或者硬件上实现多个线程并发执行的技术。以下是本站小编分享给大家的Java多线程知识点,欢迎阅读!1.1多线程的概念多线程编程的含义是你可将程序任务分成几个并行的子任务。特别是在网络编程中,你会发现很多功能是可以并发执行的。比如网...
-
Java Class文件是什么
Class类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Class类的对象用于表示当前运行的Java应用程序中的类和接口。比如:每个数组均属于一个Class类对象,所有具有相同元素类型和维数的数组共享...
相关文章
- 高中生优秀英语作文:Have a break away from electronics
- 关于javascript中encodeURI和decodeURI的使用方法
- Javascript中arguments对象的详解和使用方法
- 用 Javascript 实现锚点(Anchor)间平滑跳转
- 英语美文:Olympic Fund Scratchcard Launched
- Thinkpad笔记本开机显示Tointerrruptnormalstartup解决方法
- java如何利用java.net.URLConnection发送HTTP请求
- JavaScript instanceof 的使用方法有哪些
- My Plan for the Summer Vacation英语作文
- Should Private Cars Be Encouraged in China高中英语作文