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));
}
}
下面是我的代码。 根据我的理解,不同线程的不同对象由 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));
}
}