有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java尽管对象被锁定,但非同步方法仍然可以访问,为什么?

考虑如下:

    class A {
    public static void main(String[] args) throws InterruptedException
    {
        final A a = new A();
        new Thread()
        {
            public void run()
            {
                a.intrudeLock();
            };
        }.start();
        Thread.sleep(1000);
        new Thread()
        {
            public void run()
            {
                a.doSomethingAfterLocking();
            };
        }.start();
    }

    synchronized void doSomethingAfterLocking() throws InterruptedException
    {
        System.out.println("aquired lock");
        Thread.sleep(10000);
        System.out.println("finished stuff");
    }

    void intrudeLock()
    {
        System.out.println("don't need object's lock");
    }
}

通过锁定机制——预期输出为(至少在大多数情况下):

aquired lock
don't need object's lock
finished stuff

我不是在问为什么会有这样的输出,而是理解第二个线程不需要为其方法调用设置锁,因此可能会入侵的原因。
现在我有一个疑问——当一个线程获得锁时,它的意图是获得对该对象的独占性,直观地说,执行环境应该防止其他线程更改任何状态。但这不是Java实现它的方式。有没有理由设计这种机制


共 (0) 个答案