java高并发开发一些注意点

一 . split

   除非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果。


二.  +,stringbuilder,stringBuffer

A. +, 一般情况下性能差,但是 某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:

String S1 = “This is only a” + “ simple” + “ test”;

如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做

B, 大部分情况下  StringBuilder > StringBuffer>>+

   StringBuilder   不保证同步

  StringBuffer    线程安全(其中方法大量使用synchronized)

 

三. 缓存读取瓶颈

 Redis,memcached不能无限读写的,连接数有限制。

  官网测试结果

SET: 198412.69/s
GET: 198019.80/s

  但是实际要考虑网络开销 等,实际远远达不到这个效果,再说一个redis未必就一个应用在用。

  每次读取耗时虽少,累计就可观了,在循环中使用需谨慎

 四 乘除操作

  尽量使用移位来代替 a/b,a*b 操作,/是一个代码很高的操作

  Int num=a>>2;

五  容器初始大小

   Map等容器每次扩容,实际是新创建一个容器,然后拷贝。

   预先设置合理的size, 避免扩容,节省很多资源开销

六  TreadLocal

   ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

   看起来是没什么问题的,但是结合线程池使用就容易出问题了。

   线程池的目的是重用线程,但是 ThreadLocal是上次使用时候存的值,切记切记,建议每次清空



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值