ThreadLocal 不同线程返回同一个实例

ThreadLocal same instance returned for different threads

下面是我的代码。 根据我的理解,不同线程的不同对象由 ThreadLocal 返回。

然而,根据输出结果,所有 100 个线程都返回了相同的 simpleDateFormat 对象,这从输出结果中可以看出。

输出显示不同线程的不同哈希码,但格式化程序对象的哈希码相同

这种行为的原因是什么?

代码:-

    public class PasswordUtils {
    
    public static void main(String[] args) {

        PasswordUtils passwordUtils = new PasswordUtils();
        for(int i = 0 ; i < 100 ; i++) {
            Runnable r = () -> passwordUtils.print();
            new Thread(r).start();
        }    
        
        
    }

    private void print() {
        SimpleDateFormat simpleDateFormat = Container.formatter.get();
        
        System.out.println(Thread.currentThread().hashCode() + ".." + simpleDateFormat.hashCode());
        
        //System.out.println(simpleDateFormat.format(new Date()));
    }
    
}


class Container{
    
    
    public static ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat> () {

        @Override
        protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
        }

        @Override
        public SimpleDateFormat get() {
            // TODO Auto-generated method stub
            return super.get();
        }
        
        
        
    };
    
}

部分输出 -

1987792509..-159776256
1454218797..-159776256
1538961195..-159776256
543422400..-159776256
1174433642..-159776256
1478339661..-159776256
1225887310..-159776256
877863801..-159776256
1780641507..-159776256
1149839869..-159776256
285105474..-159776256
1805341503..-159776256
1046456602..-159776256
1587844268..-159776256
184214807..-159776256
1413925925..-159776256
1524435618..-159776256
1148128963..-159776256
1745632619..-159776256
1111741636..-159776256
799003225..-159776256
1913056178..-159776256
468763350..-159776256
1774308692..-159776256
1156098485..-159776256
1801860764..-159776256
1027791388..-159776256
580473608..-159776256
521077568..-159776256
205112696..-159776256
543478023..-159776256
233725246..-159776256
1389707361..-159776256
2098719925..-159776256
1934917117..-159776256
1379545873..-159776256
316905017..-159776256
1015697085..-159776256
680699774..-159776256
1375267811..-159776256
1347156237..-159776256
1509621224..-159776256
1083785111..-159776256
1478175754..-159776256
856529417..-159776256
1193485652..-159776256
682509788..-159776256
902590073..-159776256
43405057..-159776256
688069042..-159776256
790596691..-159776256
868880743..-159776256
796762285..-159776256
714689675..-159776256
1748149209..-159776256
45304792..-159776256
662040031..-159776256
711284131..-159776256
2115622748..-159776256
355026544..-159776256
2130317957..-159776256
1739356891..-159776256
788070019..-159776256
1821155423..-159776256
881224713..-159776256
1747515031..-159776256
833849678..-159776256

这是hashCode在SimpleDateFormat中的实现:

public int hashCode()
{
    return pattern.hashCode();
    // just enough fields for a reasonable distribution
}

您看到的不是同一个实例,但您的所有实例都具有相同的 hashCode。

您可以使用引用相等性来判断两个实例是否相同:

import java.text.SimpleDateFormat;

public class Example
{
    public static void main(String[] args)
    {
        SimpleDateFormat f1 = new SimpleDateFormat("dd/mm/yy");
        SimpleDateFormat f2 = new SimpleDateFormat("dd/mm/yy");
        System.out.println("f.equals(f2): " + f1.equals(f2));
        System.out.println("f1 == f2 " + (f1 == f2));
        System.out.println("f1 == f1 " + (f1 == f1));
    }
}