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

时间:2012-11-27 13:35:40

标签: java synchronization

我一直对以下场景感到困惑

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
            }
}

请帮忙解决这个问题。提前谢谢。

4 个答案:

答案 0 :(得分:6)

不正确。由于m2不是synchronized,因此无论synchronized方法m1的状态如何,在尝试调用时都不会阻止任何线程。

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

答案 1 :(得分:6)

  

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

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

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

(顺便说一下,我个人建议大部分时间都不要使用同步方法。而是在方法中同步,只在 的引用上>在该类中了解。这使得更容易推理代码,因为只有 你的类才能获得该锁。)

答案 2 :(得分:2)

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

总结一下:synchronized对非同步代码绝对没有阻塞效果。

答案 3 :(得分:1)

线程在进入同步方法/块时获取锁定。由于m2()未同步,它将由线程2执行。请记住,锁定仅在存在同步方法时才会显示