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,只要值相同,就认为这两个字符串相同。

你可能感兴趣的:(intern)