![]() |
1
5
拥有单独的实例没有帮助,因为所有实例都是相同的静态字段。可变静态是邪恶的。 如果您真的不能更改类,那么您可能只想使用一个锁,这样每个客户机就可以一次使用一个静态字段。如果您想拥有静态字段的不同实例,那么您可能需要使用类加载器(另一个明显的解决方案是重写字节码,这样做更不容易)。 |
![]() |
2
2
ThreadLocal类不会更改静态字段修饰符的行为。静态字段将继续在类的多个实例中有一个体现,因为它们是在类初始化时创建和初始化的。 为了更清楚地说明这一点,线程本地成员在内部使用每个线程基础上存在的映射进行管理。get()和set()调用在此映射上操作。在threadlocal中没有“魔力”,即静态成员失去了拥有单一化身的属性。将静态成员设置为线程局部变量时,只需将其添加到映射中,以供线程执行的代码的另一部分引用。这不会阻止第二个线程获取对静态成员的引用,并对成员字段执行操作。 正是因为这个原因,汤姆·霍丁的陈述应该被认真对待——可变的静力学根本不构成好的设计。 PS:看看线程的实现,threadlocal和threadlocal.threadlocalmap类将有助于消除对threadlocal对象行为的任何误解。 |