intern的妙用

要根据一个字符串实现同步

 

public void test(TaskInfo ti) {
    synchronized (ti.getId()){
        System.out.println("1111111111");
        System.out.println("2222222222");
    }
}

 

本意只想这个对象的id一样,就锁住代码。但是事实并不是这样,因为这个TaskInfo对象并不是一个,所以获取出来的id虽然值相等,但是这里并不是一个对象,这个类似于new String("1") != new String("1")

 

改造一下代码

public void test(TaskInfo ti) {
    synchronized (ti.getId().intern()){
        System.out.println("1111111111");
        System.out.println("2222222222");
    }
}

 

这样这个同步块就认为这个字符串是一个对象了,也就实现了根据相同的字符串实现同步块。

 

intern这个方法不是很常用,上网查了一下这个方法

 

当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。 这也就不难理解了即使不是同一个对象里的id,只要值相同,就认为这两个字符串相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值