CentralizedThreadLocal extends ThreadLocal<T> { @Override public String toString() { return _name; } CentralizedThreadLocal(boolean shortLived);  CentralizedThreadLocal(String name);  CentralizedThreadLocal(String name, Supplier<T> supplier);  CentralizedThreadLocal(
		String name, Supplier<T> supplier, boolean shortLived);  CentralizedThreadLocal(
		String name, Supplier<T> supplier, Function<T, T> copyFunction,
		boolean shortLived); static void clearLongLivedThreadLocals(); static void clearShortLivedThreadLocals(); static Map<CentralizedThreadLocal<?>, Object> getLongLivedThreadLocals(); static Map<CentralizedThreadLocal<?>, Object> getShortLivedThreadLocals(); static void setThreadLocals(
		Map<CentralizedThreadLocal<?>, Object> longLivedCentralizedThreadLocals,
		Map<CentralizedThreadLocal<?>, Object>
			shortLivedCentralizedThreadLocals); @Override boolean equals(Object object); @Override T get(); @Override int hashCode(); @Override void remove(); @Override void set(T value); SafeClosable setWithSafeClosable(T value); @Override String toString();  }
@Test public void testToString() { CentralizedThreadLocal<?> centralizedThreadLocal = new CentralizedThreadLocal<>("test"); Assert.assertEquals("test", centralizedThreadLocal.toString()); centralizedThreadLocal = new CentralizedThreadLocal<>(null); Assert.assertEquals( CentralizedThreadLocal.class.getName() + "@" + Integer.toHexString(centralizedThreadLocal.hashCode()), centralizedThreadLocal.toString()); }