为了账号安全,请及时绑定邮箱和手机立即绑定

一个类的对象锁只有一个,类锁呢?

一个类的对象锁只有一个,类锁呢?

炎炎设计 2019-02-21 03:07:06
一个类的对象锁只有一个,如果有几个非静态函数都是synchronized,在某一时刻只有一个线程能调用其中一个函数 假如一个类有几个静态函数是synchronized,在某一时刻只有一个线程能调用其中一个静态函数吗?也就是类锁也只有一个吗?
查看完整描述

6 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

前面一种锁的是实例对象,锁定了当前的那个对象,如果有多个实例对象,这些synchronized方法之间不是同步的。第二种锁的是类对象,类对象就一个,所以是同步的。

查看完整回答
反对 回复 2019-03-01
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

public class Foo {

    synchronized void test1() {
        //to implements
    }

    void test2() {
        synchronized(this) {
            //to implements
        }
    }

    synchronized static void test3() {
        //to implements
    }

    static void test4() {
        synchronized(Foo.class) {
            //to implements
        }
    }
}

如上代码,test1方法相当于test2,当this是同一个对象时,会发生阻塞。当然,不同对象没有关系,因为this不一样。称为对象级锁。
test3相当于test4,这里是用class对象作为锁,因为一般情况下一个类的类实例只有一个,那么每次进入这个方法都会锁。称为类级锁。

查看完整回答
反对 回复 2019-03-01
?
呼唤远方

TA贡献1856条经验 获得超11个赞

  • 非静态同步方法(A)用的锁就是当前实例对象本身,一个实例的A获取锁之后,该实例的其他A必须等待锁的释放,多个实例用的都是不同的锁;

  • 静态同步方法(B)用的锁是类对象本身,一旦一个B获取锁之后其他的B都必须等待释放锁,不管是一个实例还是多个实例;

另外 A和B之间用不同的锁,所以不会有竞争关系;

查看完整回答
反对 回复 2019-03-01
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

Class类创建一个对象就是代表一个普通类,这时“类锁”就是这个实例对象上的锁

查看完整回答
反对 回复 2019-03-01
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

你说的是“互斥锁”的概念,针对synchronized修饰方法有两种情况:

【非静态方法】

当一个方法被synchronized修饰后,锁对象为当前方法所属对象,即方法中的this。

【静态方法】

当一个静态方法被synchronized修饰后,该静态方法上锁的对象为当前类对象(Class类的实例)。每个类都有唯一的一个类对象。获取类对象的方式:类名.class。

而对于互斥的场景,需要理解两点说明:

1、静态方法与非静态方法同时声明了synchronized,他们之间是非互斥关系的。原因在于,静态方法锁的是类对象而非静态方法锁的是当前方法所属对象。

2、当Synchronized修饰的是两段不同的代码,但是锁对象相同时,两个线程分别调用者两段代码时就是互斥的

所以你说的“一时刻只有一个线程能调用其中一个函数”(即互斥),判断条件就是锁对象是否相同,与方法类型无关。

查看完整回答
反对 回复 2019-03-01
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

对象方法的synchronized修饰,锁为对象自身,也就是this;
静态方法的synchronized修饰,锁为Class对象自身,也就是由类加载器创建的类对象;

查看完整回答
反对 回复 2019-03-01
  • 6 回答
  • 0 关注
  • 968 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信