请问我这段业务如何用double check lock 做同步处理

问题描述

private volatile static ConcurrentHashMap<String, List<ClassTO>> cacheClass=new ConcurrentHashMap<String, List<ClassTO>>();--------------------------List<ClassTO> classes=cacheClass.get(classPrefix);if(null == classes) { classes=new ArrayList<ClassTO>(); classTo=new ClassTO(classKey);} else { for(ClassTO tmp: classes) { if(classKey.equals(tmp.getKey())) { classTo=tmp; break; } }}methodTo=classTo.get(methodAndParamskey);if(null == methodTo) { methodTo=new MethodTO(methodAndParamskey);}doCache(result, data, methodTo, method);classTo.add(methodTo);CacheHandler.getCacheInstance().set(methodAndParamskey, data.getExpiration(), methodTo);classes.add(classTo);cacheClass.put(classPrefix, classes); 问题补充:这样效率会有问题的啊,本想用double check来做一下 但是里面的判断太多了niuzai 写道

解决方案

是的,ConcurrentHashMap本来就是线程安全的。不需要再控制了~现在并发编程一般建议采用java concurrent API,它是语句块级别的控制。毕竟是大牛编写的,已经封装的很好了~ 没有必要再用原生的方式了撒!即费事又费时,还有可能不讨好,哈哈~
解决方案二:
亲,double-checked locking无外乎控制粒度再小一点点而已,这里已经是语句级别的同步方案,效率问题不会有太大影响的。再加上你这里分支太多了,暂时想不出来更好的解决方案,呵呵。。。
解决方案三:
亲,互斥一把中不中?Lock lock = new ReentrantLock(); List<ClassTO> classes=cacheClass.get(classPrefix);lock.lock();try{ if(null != classes){ for(ClassTO tmp: classes) { if(classKey.equals(tmp.getKey())) { classTo=tmp; break; } } }else{ classes= new ArrayList<ClassTO>(); classTo= new ClassTO(classKey); } methodTo = classTo.get(methodAndParamskey); if(null == methodTo) { methodTo=new MethodTO(methodAndParamskey); }}finally{ lock.unlock();}

时间: 2024-09-13 13:55:43

请问我这段业务如何用double check lock 做同步处理的相关文章

c++-C++ : 请问下面这段代码为何会出现double free 的问题?

问题描述 C++ : 请问下面这段代码为何会出现double free 的问题? 下面这段代码对象在析构的时候判断了指针是否为空再进行操作,为何还会出现double free 的问题? #include<iostream> using namespace std; class base { public: base(int *a):p(a) {} base(int num) :p(new int(num)) {} base(base& mid) :p(mid.p) { cout <

c++-请问下面这段代码的意思:C++ 中的冒号操作符

问题描述 请问下面这段代码的意思:C++ 中的冒号操作符 PaketRouter类里有一个成员: // Map from ssrc to sending rtp module. std::list rtp_modules_ GUARDED_BY(crit_.get());请问下面的函数里冒号是什么意思? bool PacketRouter::TimeToSendPacket(uint32_t ssrc uint16_t sequence_number int64_t capture_timest

代码提示出错-请问我这段代码哪里出错了,为什么总是异常,我是个新手

问题描述 请问我这段代码哪里出错了,为什么总是异常,我是个新手 package control; import javax.swing.JFrame public class DebugTest { public static void main(String[] args) { int[] ints= new int[20]; try { for (int i=0; i < 20; i ++) { ints[i] = i+1; Ststem.out.println(i+1); } } catc

boot-的入口地址在哪里定义的。请问下代码段的入口地址是在哪定义的

问题描述 的入口地址在哪里定义的.请问下代码段的入口地址是在哪定义的 用的是FL2440的开发板里的2440init.s代码.请问下代码段的入口地址是在哪定义的GET option.inc GET memcfg.inc GET 2440addr.inc BIT_SELFREFRESH EQU (1<<22) ;Pre-defined constantsUSERMODE EQU 0x10FIQMODE EQU 0x11IRQMODE EQU 0x12SVCMODE EQU 0x13ABORTMO

请问这种不规范的json如何用java解析,安卓开发中遇到的。

问题描述 请问这种不规范的json如何用java解析,安卓开发中遇到的. 解析一个开发接口提供的json时出现了这个格式的{"key":["value1","value2","value3"]} .已使用代码如下: String []result=(String[]) o.get("result"); 不成功.菜鸟求教 先谢过! 解决方案 怎么不规范了? 你要转成对象还是干嘛? 解决方案二: 请教了一位大神

c++-OpenGL初学,请问我这段代码有错吗?为什么在窗口显示不出来

问题描述 OpenGL初学,请问我这段代码有错吗?为什么在窗口显示不出来 #include #include #include #include #include const GLint screenWidth = 640; const GLint screenHeight = 480; void myInit(void) { glClearColor(1.0, 1.0, 1.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluO

java 继承 多态-请问下这段代码正确的原因,为什么父类可以调用抽象方法,执行的是子类重写的方法

问题描述 请问下这段代码正确的原因,为什么父类可以调用抽象方法,执行的是子类重写的方法 public class TestA { public static void main(String[] args) { TestA a = new TestA(); a.start(); } public void start(){ B b = new B(); b.funA(); } public abstract class A { public void funA(){ System.out.pri

线程-请问为什么第二段代码无法正确运行?

问题描述 请问为什么第二段代码无法正确运行? package threadlearning; public class BankThread { public static void main(String[] args) { // TODO Auto-generated method stub ChuHu ch1=new ChuHu(); ChuHu ch2=new ChuHu(); Thread t1=new Thread(ch1,"aaa"); Thread t2=new Thr

请问下面这段SQL注入的代码能起到什么作用?

问题描述 请问下面这段SQL注入的代码能起到什么作用? 最近服务器被攻击,提交的URL包含这样一段 (SELECT 1160 FROM(SELECT COUNT(*),CONCAT(0x68486c6b4573,(SELECT (CASE WHEN (1160=1160) THEN 1 ELSE 0 END)),0x614b434b4f55,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)-- vqA