[英]Java Synchronized and static synchronized method used by Multiple Threads
我一直对以下情况感到困惑
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
}
}
这非常令人困惑,请帮忙。 提前致谢。
不正确。 由于m2
不synchronized
,因此无论synchronized
方法m1
处于什么状态,尝试调用它时都不会阻塞任何线程。
获取对象上的锁不会阻止对该对象的访问,而只是阻止另一个线程同时获取同一对象上的锁的能力。 如果另一个线程不尝试获取该锁,则不会被阻塞。
现在我的理解是,如果T2尝试访问非同步方法m2(),它将被阻塞,因为当前对象锁定在T1上
否m2()
未同步,因此没有阻止它的内容。 这就是同步方法和非同步方法之间的区别。
当线程尝试输入同步方法时,它将阻塞直到可以获取适当的监视器(锁定)。 退出该方法时,它将释放锁定。 对于非同步方法,这些步骤均不会发生。
(顺便说一句,我个人建议大多数情况下完全不使用同步方法。相反,在该类内仅是已知的引用上在该方法内进行同步。这样可以更轻松地进行代码推理,因为只有您的班级才能获得该锁。)
你错了。 对象不会被synchronized
块“锁定”,唯一发生的事情是,其他试图获取该对象监视器的synchronized
块必须等待。
综上所述: synchronized
对非同步代码绝对没有阻塞作用。
线程进入同步方法/块时将获得锁。 由于m2()不同步,它将由线程2执行。请记住,只有在存在同步方法时,锁才会出现
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.