synchroized String object 时使用guava的interner代替String.intern()

synchroized代码块, 直接使用String作为lock的时候,不会起作用

此时可已使用String.intern()作为代替,

但String.intern()的缺陷是 如果字符串特别多,导致放入字符串池的String不可控,有可能导致OOM错误或者过多的Full GC

具体参考这里

http://stackoverflow.com/questions/10578984/what-is-string-interning/10579062#10579062

因此使用guava的Interner作为代替

private Interner<String> interner = Interners.<String>newWeakInterner();

public  void test(String str){
    synchronized(interner.intern(str)){
             ...
    };
}

好处是Note that unlike String.intern(), using this interner does not consume memory in the permanent generation.

synchroized String object 时使用guava的interner代替String.intern()

时间: 2024-10-07 06:10:07

synchroized String object 时使用guava的interner代替String.intern()的相关文章

分页查询和分页缓存查询,List&lt;Map&lt;String, Object&gt;&gt;遍历和Map遍历

分页查询 String sql = "返回所有符合条件记录的待分页SQL语句"; int start = (page - 1) * limit + 1; int end = page * limit; sql = "select * from (select fulltable.*, ROWNUM RN from (" + sql + ") fulltable where ROWNUM <= " + end + ") where

ArrayList&lt;HashMap&lt;String,Object&gt;&gt;集锦

1.   Android中如何从一个Activity中ArrayList<HashMap<String,Object>>传递到另一个activity?      eg:      存:intent.putExtra("arrayList", dataList);     取(记得强制类型转换):     ArrayList<HashMap<String, Object>> dataList = new ArrayList<HashM

添加,删除List&lt;Map&lt;String, Object&gt;&gt;元素

添加 //初始化 List<Map<String, Object>> products = new ArrayList<Map<String,Object>>(); //也可以这样初始化List<Map<String, Object>> products = null //初始Map<String,Object> Map<String,Object> product01 = null; product01.pu

SONObjetc和String Map Bean互转,JSONArray和String List互转

1 import java.util.ArrayList; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 6 import com.alibaba.fastjson.JSONArray; 7 import com.alibaba.fastjson.JSONObject; 8 9 10 public class JSONParse { 11 12 public static void m

jdbcTemplate.queryForObject(String, Object[], Class&lt;String&gt;)提示必须引入DataAccessException

今天使用Spring4时发现没有jdbcTemplate.queryForInt(String, Object[])方法,百度后才知道原来Spring在3.2.2后就不再使用queryForInt()和queryForLong()等方法了.然后就改用jdbcTemplate.queryForObject(String, Object[], Class<String>),结果就遇到了报错问题,提示必须引入DataAccessException类: 百度了几个帖子才找到这个类(DataAccess

速战速决 (2) - PHP: 数据类型 bool, int, float, string, object, array

[源码下载] 作者:webabcd 介绍速战速决 之 PHP 数据类型 bool, int, float, string, object, array 示例1.数据类型: bool, int, float, string, objectbasic/type1.php <?php /** * 数据类型: bool, int, float, string, object */ // 布尔类型(true, false 不分大小写) $b = true; if ($b) { echo "true&

Map&lt;String, Object&gt; 转实体类对象工具类

public static <T> T map2Object(Map<String, Object> map, Class<T> clazz) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if (map == null) { return null; } T obj = null; try { // 使用newInstance来创建对象 obj = cla

javaBean与Map&lt;String,Object&gt;互转

1. 为什么要实现javaBean与Map<String,Object>相互转换? 用过spring的都知道spring的MVC框架中有一个BaseCommandController对象,利用这个对象我们就可以很方便的将从客户端传递过来的参数封装到一个JavaBean对象中去,而不需要我们request.getParameter("name");bean.setName(name);了,从而也简化了不少的工作.如果大家用过BeanUtils.populate的话,就知道,这

今天学会了对List&lt;Map&lt;String,Object&gt;&gt;的排序

Collections.sort(dyList, new Comparator<Map<String, Object>>() { public int compare(Map<String, Object> arg0, Map<String, Object> arg1) { int map1value=0; int map2value=0; if(arg0.get("getlicenseDate")!=null&&!arg