假设我有一个使用来自其他类的公共静态HashTable的synchronized方法。如何使此方法线程安全?根据我的理解,任何其他线程都可以在其他类中更改此HashTable,而不是在包含键的类(同步方法的类)中更改它,不是吗?
答案 0 :(得分:1)
您对HashTable的理解不正确。 HashTable是同步和线程安全的。
查看HashTable
的源代码。所有公共方法都是同步的。
public synchronized V put(K key, V value) {
public synchronized V get(Object key) {
public synchronized boolean contains(Object value) {
答案 1 :(得分:0)
如果要在synchronized方法中使用 HashMap ,它可以工作,但前提是所有线程都使用同时包含方法和 HashMap的类的实例,为了更清楚,请看下面的示例:
代码段
public class SynchronizedCounter {
private int c = 0;
public synchronized void increment() {
c++;
}
}
现在,如果所有线程使用相同的 SynchronizedCounter 实例,我们确保只有一个线程正在运行increment()
方法,但是如果每个线程都在实例化他自己的SynchronizedCounter实例那么该方法不会是线程安全的。
Oracle的官方说明here。