synchronized锁字符串问题 + String.intern()解决 + google的Interners解决 java单机锁

一:String.intern()解决
比如需要锁住的商品id是Long id = 1000;

synchronized (id.toString().intern()){
//do...
}

造成的问题:
常量池有限,存储在hashtable中,数据多了之后,碰撞厉害,而且容易加重full gc负担 。
二: google的Interners解决
在类级别初始化** Interners.newWeakInterner()**

public class test{
    private static Interner<String> lock = Interners.newWeakInterner();
    public void test() {
        synchronized (lock.intern(id.toString())){
		//do...
		}
    }
}

总结:Interners内部基于ConcurrentHashMap实现,而且可以设置引用类型,不会加重full gc负担,但有一个问题就是如果gc回收了存储在Interners里面的String,那lock.intern(lock)可能也会返回不同的引用,总之,还是建议使用Interners,效率和内存使用率更高。

测试时可以使用System.identityHashCode()查看锁住对象的HashCode是不是一致,一致即不同线程需获取同一个对象锁才能访问,实现被锁住的代码块串行化运行。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值