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