繁体   English   中英

多线程使用的Java同步和静态同步方法

[英]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
            }
}

这非常令人困惑,请帮忙。 提前致谢。

不正确。 由于m2synchronized ,因此无论synchronized方法m1处于什么状态,尝试调用它时都不会阻塞任何线程。

获取对象上的锁不会阻止对该对象的访问,而只是阻止另一个线程同时获取同一对象上的锁的能力。 如果另一个线程不尝试获取该锁,则不会被阻塞。

现在我的理解是,如果T2尝试访问非同步方法m2(),它将被阻塞,因为当前对象锁定在T1上

m2()未同步,因此没有阻止它的内容。 这就是同步方法和非同步方法之间的区别。

当线程尝试输入同步方法时,它将阻塞直到可以获取适当的监视器(锁定)。 退出该方法时,它将释放锁定。 对于非同步方法,这些步骤均不会发生。

(顺便说一句,我个人建议大多数情况下完全不使用同步方法。相反,在该类内是已知的引用上该方法进行同步。这样可以更轻松地进行代码推理,因为只有您的班级才能获得该锁。)

你错了。 对象不会被synchronized块“锁定”,唯一发生的事情是,其他试图获取该对象监视器的synchronized块必须等待。

综上所述: synchronized对非同步代码绝对没有阻塞作用。

线程进入同步方法/块时将获得锁。 由于m2()不同步,它将由线程2执行。请记住,只有在存在同步方法时,锁才会出现

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM