Java同步和访问静态字段的静态同步方法

标签 java synchronization

如果静态同步方法和实例同步方法尝试在不同线程中访问同一类的静态字段,以下程序的行为会是什么?任何线程都会被阻塞吗?这非常令人困惑。

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

最佳答案

同步实例方法相当于

public void m1() {
    synchronized(this) {
        ...
    }
}

(嗯,它们并不完全相同,但您问题的答案不会受到这种差异的影响)。

同步静态方法在类上同步:

public void m2() {
    synchronized(MyClass.class) {
        ...
    }
}

如您所见,两个 block 在不同对象上同步:m1在调用它的实例上同步,并且 m2Class<MyClass> 的实例上同步它代表 JVM 中的类。所以这两个方法可以被调用而不会互相阻塞。

关于Java同步和访问静态字段的静态同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15250201/

相关文章:

java - 读取整数字符串并将整数添加到数组

java - 读取excel文件并添加到java实体类中

java - EntityManager 查询出现问题

selenium - Web 应用程序和移动应用程序自动化测试以及 selenium/appium

sql - 在线和本地sql数据库同步

javascript - 批处理 Backbone.js 事件?

java - 在java中用两个线程打印HashMap的键?

java - 运行时的依赖确定

java - Maven:通过项目目录外的相对路径向jar添加依赖项

java - 将synchronizedList与for循环结合使用并在其中添加项目