使用来自其他类的公共静态HashTable的synchronized方法。如何使此方法线程安全?

时间:2015-10-28 10:35:56

标签: java thread-safety

假设我有一个使用来自其他类的公共静态HashTable的synchronized方法。如何使此方法线程安全?根据我的理解,任何其他线程都可以在其他类中更改此HashTable,而不是在包含键的类(同步方法的类)中更改它,不是吗?

2 个答案:

答案 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