在静态对象上同步

时间:2014-05-09 07:49:04

标签: java static synchronization

我对同步实际如何工作感到困惑。我有以下代码:

public class FunTest {
    static FunTest test;

    public void method() {
        synchronized (test) {
            if (Thread.currentThread().getName() == "Random1") {
                try {
                    wait();
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            } else {
                notify();
            }
        }
    }

    public static void main(String[] args) {
        test = new FunTest();
        final FunTest t0 = new FunTest();
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                t0.method();
            }
        });
        Thread t3 = new Thread(new Runnable() {
            public void run() {
                t0.method();
            }
        });
        t1.setName("Random1");
        t3.setName("Random2");
        t1.start();
        t3.start();
    }
}

代码在运行时抛出IllegalMonitorStateException。我不明白为什么会这样。难道不可能以这种方式获得锁吗?

如果我在同步块中将test替换为this,它可以正常工作。为什么会这样?

2 个答案:

答案 0 :(得分:2)

您在test上打开了一个监视器阻止,但是您将wait()notify()应用于this

答案 1 :(得分:0)

根据wait()的javadoc

  

“当前线程必须拥有此对象的监视器”

在你的情况下,它不是。

t0.method();更改为test.method()即可。但不确定你的用例。