首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >synchronized(类引用)做了什么?

synchronized(类引用)做了什么?
EN

Stack Overflow用户
提问于 2013-03-31 21:53:47
回答 4查看 145关注 0票数 4
代码语言:javascript
复制
synchronized(Foo.Class){
   //some code..
}

这是锁定Foo类的所有实例,还是只锁定它的静态方法/字段?

EN

回答 4

Stack Overflow用户

发布于 2013-03-31 21:58:32

它进入Foo.class对象的监视器。如果另一个方法也在Foo.Class上同步,它将不得不等待,假设它在不同的线程中。

如果一个方法没有在它上面同步,那么它将不会受到影响,无论它是静态的还是非静态的。同步的静态方法并不是在定义它们的类的类对象上隐式同步。

票数 6
EN

Stack Overflow用户

发布于 2014-09-12 21:25:51

类对象的同步与实例的同步完全相同。像Foo.class这样的类是一个对象,因此有一个内置的监视器。您提供的代码:

代码语言:javascript
复制
synchronized(Foo.Class){
   //some code..
}

同步对Foo类的访问。当尝试同步类的静态变量时,它会很有用。例如:

代码语言:javascript
复制
public class Foo{

    private static int COUNTER = 0;

    synchronized public static void increment(){

        COUNTER ++;
    }

    public static void decrement(){
        synchronized (Foo.class) {

            COUNTER ++;
        }
    }
}

正如您所看到的,Foo.class的同步可以与任何实例一样实现。当尝试同步实例的代码块时,将使用:synchronized(this){},在类对象的情况下,它等同于synchronized(Foo.class){}。这同样适用于同步的方法:synchronized public void increment(){}等同于:synchronized public static void increment(){}

现在关于你的问题:

是锁定Foo类的所有实例,还是只锁定它的静态方法/字段?

当然,它不会如上所述获取所有实例的锁。此外,类对象不知道创建的实例。synchronized块不会锁定字段。它只锁定一个代码/方法块,该代码/方法块被强制由获得该锁的线程作为原子操作执行,并且没有其他线程可以进入该代码块(但如果它们不同步,则可以执行其他块),直到第一个线程释放锁(在Java语言中,锁是花括号}).的末尾

票数 1
EN

Stack Overflow用户

发布于 2013-03-31 22:06:36

它同步对使用它的方法/同步子句的访问。这些可以是类Bar的方法--不一定是Foo。

重要的是,在"Foo.class“上同步的所有方法/同步子句都被相互排除,不能同时执行。

同步根本不影响字段--无法将字段声明为已同步。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15730105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档