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

多线程使用的Java同步和静态同步方法,java,synchronization,Java,Synchronization,我一直对下面的场景感到困惑 MyClass只有一个对象,有两个线程T1、T2。 现在一个线程说T2将能够使用同步方法m1(),该方法只有MyClass对象锁,而另一个线程T2如果试图访问m1(),将被阻塞 现在我的感觉是,如果T2试图通过访问静态共享字段来访问静态同步方法m2(),它将被阻止,因为当前对象锁与T1在一起,无法执行m2(),如果Myclass有两个对象,那么T2线程将能够访问m1()。我是对的还是错的 class MyClass { public stat

我一直对下面的场景感到困惑

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
的状态如何,在尝试调用它时都不会阻止任何线程


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

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

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

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

否。
m2()
不同步,因此没有什么可以阻止它。这就是同步方法和非同步方法之间的区别

当线程尝试进入同步方法时,它将阻塞,直到它能够获得适当的监视器(锁)。它将在退出该方法时释放锁。对于非同步方法,这两个步骤都不会发生

(顺便说一句,我个人建议在大多数情况下根本不要使用同步方法。相反,在方法中,在一个仅在该类中已知的引用上进行同步。这使得对代码进行推理更容易,因为只有您的类才能获得该锁。)

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

否。
m2()
不同步,因此没有什么可以阻止它。这就是同步方法和非同步方法之间的区别

当线程尝试进入同步方法时,它将阻塞,直到它能够获得适当的监视器(锁)。它将在退出该方法时释放锁。对于非同步方法,这两个步骤都不会发生


(顺便说一句,我个人建议在大多数情况下根本不要使用同步方法。相反,在方法中,在一个仅在该类中已知的引用上进行同步。这使得对代码进行推理更容易,因为只有您的类才能获得该锁。)线程在进入同步方法/块时获取锁。由于m2()未同步,它将由线程2执行。请记住,只有当存在同步方法时,锁才会出现在图片中。

线程在进入同步方法/块时才会获取锁。由于m2()未同步,它将由线程2执行。请记住,只有在有同步方法的情况下,锁才会出现在画面中。对象不会被
synchronized
块“锁定”,唯一发生的事情是其他
synchronized
块尝试获取该对象的监视器时必须等待


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

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

总之:
synchronized
对非同步代码绝对没有阻塞效果