一个方法调用性能问题

问题描述

public class Test {private static List<String> list ;static{list = new ArrayList<String>();list.add("0");list.add("1");list.add("2");list.add("3");}public String get(int subscript){return list.get(subscript);}public boolean update(){list.clear();list.add("a");list.add("b");list.add("c");list.add("d");return true;}private Test(){}public static Test getInstance(){return SingleHolder.instance;} private static class SingleHolder{private static final Test instance = new Test();}}程序在正在调用 get 时 不能调用 update 当程序正在调用update 时 get 不能调用update 可能n久不能调用如果加锁 怎么写性能最高

解决方案

楼上的方式最好了!当然如果仅仅是对数组或Map的操作可以试试已经提供的集合类如:CopyOnWriteArrayList 比较适合多读取很少更新的操作。比锁的机制更高效。常用的方法 addIfAbsent,addAllAbsent,addAll,add,removeAll 如果能灵活运用,应该也可以满足需求了
解决方案二:
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); private final Lock r = rwl.readLock(); private final Lock w = rwl.writeLock(); public String get(int subscript){ r.lock();try{ return list.get(subscript); }finally{r.unlock();} } public boolean update(){ w.lock();try{ list.clear(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); return true; }finally{w.unlock();} } 这样才是最优的(就目前本人所知),至于原理参考jdk文档或者网络资料吧
解决方案三:
方法1: List变成vector,那么可以在最细粒度控制线程安全。方法2: public String get(int subscript){ synchronized (this) { return list.get(subscript); }} public boolean update(){ synchronized (this) { list.clear(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); return true; } } 方法3,在以上两个方法上直接加上 synchronized 。好坏从1到3。

时间: 2024-12-27 05:55:52

一个方法调用性能问题的相关文章

bearcat-jstrace 让检测线上方法调用性能成为可能

概述 tj 实现了一个 jstrace,可以用于动态的对node进行类似于dtrace,ktap的trace分析,可以动态检测线上api接口的访问性能,用于express中tj也实现了一个中间件express-jstrace,但是express-jstrace更像一个filter,只能检测req res的性能,通过bearcat提供的强大的AOP支持, 让监控线上方法调用性能成为可能 实现 bearcat-jstrace 即是基于jstrace和bearcat aop的实现, 使用起来也是相当的

spring事务,在一个方法调用不同的service,怎么保证使用一个事务

问题描述 spring事务,在一个方法调用不同的service,怎么保证使用一个事务 在struts的action里一个方法调用不同service方法,怎么使用两个service方法公用一个事务 解决方案 http://blog.csdn.net/hawksoft/article/details/7205952 自己google下二段提交 解决方案二: 支持当前事务就行了,如果当前没有事务的话,就重启一个事务 解决方案三: 把spring的事务传播设置成当前如果有事务加入的那个,然后在这个act

部署在server 2008 iis7.0的WebServices方法调用win32.dll时出错

问题描述 部署在iis7.0的WebServices的一个方法调用了win32.dll一旦调用这个方法应用程序池也关闭!页面出现无法访问!但是在部署在xpiis5.0的同样的WebServices就可以正常访问.是不是权限问题还是IIS7.0配置问题!是不是iis7.0的安全机制默认禁止调用win32非托管类库.如果是如何配置..请教高手................................. 解决方案

关于java里面用getMethod调用方法的性能问题。

问题描述 最近我在开发一个工程(我开发的是Web工程),里面用到了java的这个功能,但是大家都在怀疑这这种方法的性能问题.我自己也没有太大的自信.有没有高手能给指导一下.就是类似下面例子里的调用问题.ClassmyClass=MethodPointerTest.class;Methodadd=myClass.getMethod("add",int.class,int.class);ClassyourClass=Class.forName("YourClass");

java-如何在页面调用一个方法获取它的值

问题描述 如何在页面调用一个方法获取它的值 <%String strid = request.getParameter(""id"");String giftid=new String(request.getParameter(""id""));System.out.println(strid);int gid=Integer.parseInt(strid);System.out.println(gid);Gift gt

java中在使用log4j中的error打印日志时,怎么能捕获到,然后去调用另一个方法。

问题描述 java中在使用log4j中的error打印日志时,怎么能捕获到,然后去调用另一个方法. 使用log4j中的error打印日志时,怎么能捕获到,然后去调用另一个方法. 解决方案 java日志信息 log4j 使用方法java日志信息 log4j 使用方法java日志信息 log4j 使用方法 解决方案二: 一般的error级别的日志都是在异常分支中打印的.你可以直接在catch分支里面调用需要的方法.

java方法-java一个方法形参有两个,如何在调用的时候只传入一个参数

问题描述 java一个方法形参有两个,如何在调用的时候只传入一个参数 如题,有一个方法里两个形参,我另一个文件类中一个方法想要那个方法的返回值,可是第二个参数在这里用不到,能否只传第一个参数 如何实现,前提这个类不能继承后重写方法,因为多人合同写的. 解决方案 不可以,变通的办法是再写一个只有一个参数的函数重载形式,在其中给另一个参数一个预设值,间接调用. 解决方案二: 一个Action调用两个不同的方法 解决方案三: 调用的时候给一个无影响的值 解决方案四: 讲道理的话是不能这样做的,不过如果

asp.net-asp. net 前台调用后台的一个方法,点击按扭时如何调用呢,调用如下方法

问题描述 asp. net 前台调用后台的一个方法,点击按扭时如何调用呢,调用如下方法 void test() { char[] constant = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; StringBuilder ascii = new StringBuilder(); Random random = new Random(); for (int i = 0; i < 6; i++) { ascii.Append(cons

ejb方法调用-EJB3.0中怎么一个类调用另外一个类的方法

问题描述 EJB3.0中怎么一个类调用另外一个类的方法 我做得的是struts+ejb3.0,在EJB中我想用BIZ调用dao,是直接New还是有别的方法...求大神指教..... 这是BIZ的方法 public List queryPet(String pelName,String pelZr,String pelType ,String px) { System.out.println("aaaaaaaaaaaaaaaaaaaa"); IDao dao=new IDaoImpl()