我一直对以下场景感到困惑
MyClass只有一个对象,有两个线程T1,T2。 现在一个线程说T2将能够使用同步方法m1(),它具有唯一的MyClass对象锁定,而其他线程T2将被阻止,如果它将尝试访问m1()。
现在我的看法是,如果T2将尝试通过访问静态共享字段来访问静态同步方法m2(),它将被阻止,因为当前对象锁定是T1并且不能执行m2()并且如果有两个Myclass然后T2线程的对象将能够访问m1()。我是对还是错?
class MyClass
{
public static int i = 5;
public synchronized void m1()
{
System.out.println(i); //uses static field i of MyClass
//T1 is executing this method
}
public static synchronized void m3()
{
//T2 will be able to call this method on same object lock while it is using
//static field i???
System.out.println(i);//uses static field i of MyClass
}
}
请帮忙解决这个问题。提前谢谢。
答案 0 :(得分:6)
不正确。由于m2
不是synchronized
,因此无论synchronized
方法m1
的状态如何,在尝试调用时都不会阻止任何线程。
获取对象的锁定不会阻止对该对象的访问,它只会阻止另一个线程同时获取同一对象上的锁定的能力。如果另一个线程没有尝试获取锁定,则不会被阻止。
答案 1 :(得分:6)
现在我的看法是,如果T2将尝试访问非同步方法m2(),它将被阻止,因为当前对象锁定是T1
没有。 m2()
未同步,因此无法阻止它。这是同步和非同步方法之间的区别。
当线程尝试输入同步方法时,它将阻塞,直到它可以获取适当的监视器(锁定)。它将在退出方法时释放锁定。对于非同步方法,这些步骤都不会发生。
(顺便说一下,我个人建议大部分时间都不要使用同步方法。而是在方法中同步,只在 的引用上>在该类中了解。这使得更容易推理代码,因为只有 你的类才能获得该锁。)
答案 2 :(得分:2)
你错了。对象不会被synchronized
块“锁定”,唯一发生的事情是尝试获取该对象的监视器的其他synchronized
块必须等待。
总结一下:synchronized
对非同步代码绝对没有阻塞效果。
答案 3 :(得分:1)
线程在进入同步方法/块时获取锁定。由于m2()未同步,它将由线程2执行。请记住,锁定仅在存在同步方法时才会显示