首页 > 试题广场 >

关于下面一段代码,以下说法正确的是: () public c

[不定项选择题]
关于下面一段代码,以下说法正确的是: ()
public class Test {
    private synchronized void a() {
    }
    private void b() {
        synchronized (this) {
        }
    }
    private synchronized static void c() {
    }
    private void d() {
        synchronized (Test.class) {
        }
    }
}

  • 同一个对象,分别调用方法a和b,锁住的是同一个对象
  • 同一个对象,分别调用方法a和c,锁住的是同一个对象
  • 同一个对象,分别调用方法b和c,锁住的不是同一个对象
  • 同一个对象,分别调用方法a、b、c,锁住的不是同一个对象

修饰非静态方法 锁的是this 对象

修饰静态方法 锁的是class对象

发表于 2019-08-22 07:47:56 回复(37)
方法a为同步方法,方法b里面的是同步块,同步方法使用的锁是固有对象this,同步块使用的锁可以是任意对象,但是方法b里面的同步块使用的锁是对象this,所以方法a方法b锁住的是同一个对象方法 c为静态同步方法,使用的锁是该类的字节码文件,也就是Test.class。方法d里面的也是同步块,只不过使用的锁是Test.class所以方法c方法d锁住的是同一个对象
发表于 2019-08-29 16:10:21 回复(16)
  • 同步代码块(synchronized(this),synchronized(类实例对象),锁是小括号()中的实例对象)
  • 同步非静态方法(synchronized method),锁的是当前对象的实例对象
获取类锁
  • 同步代码块(synchronized(类.class)),锁是最小括号 () 中的类对象(Class对象)
  • 同步静态方法(synchronized static method),锁是当前对象的类对象(Class 对象)
总结
  • 有线程访问对象的同步代码块时,另外的线程可以访问该对象的非同步代码块
  • 若锁住的是同一个对象,一个线程在访问对象的同步代码块时,另一个访问对象的同步代码块的线程会被阻塞。
  • 若锁住的是同一个对象,一个线程在访问对象的同步方法时,另一个访问对象的同步方法的线程会被阻塞。
  • 若锁住的是同一个对象,一个线程在访问对象的同步代码块时,另一个访问对象同步方法的线程会被阻塞,反之亦然。
  • 同一个类的不同对象的锁互不干扰
  • 类锁由于也是一种特殊的对象锁,因此表现和上述一致,而由于一个类只有一把对象锁,所以同一个类的不同对象使用类锁将会是同步的
  • 类锁和对象锁互不干扰

发表于 2019-10-12 10:27:24 回复(6)
正确答案应该是AC.同步普通方法锁的是this也就是当前对象,同步静态方法锁的是类对象,也就是Class对象
发表于 2019-08-22 22:46:44 回复(6)
???a和d不矛盾吗
发表于 2019-08-22 08:18:10 回复(1)
我觉得D选项应该从整体上判断对错,即a,b,c这三个方法是不是锁住了同一个对象,显而易见,a和b方法锁住的是Test对象,而c锁住的是Test类,所以从整体上来判断,D选项是正确的。
不过,恕我直言,D选项的描述确实有点歧义。。
发表于 2019-09-10 14:59:18 回复(3)
A C D
  1. 对于普通同步方法,锁是当前实例对象。

  2. 对于静态同步方法,锁是当前类的Class对象。

  3. 对于同步方法块,锁是synchronized括号里配置的对象。

编辑于 2020-02-03 19:32:02 回复(1)
把d改了行吗,出这种题没意思
发表于 2021-10-01 12:46:48 回复(1)
a,b锁的是同一个对象,b,c锁的不是同一个对象,那么a,b,c锁的也不是同一个对象才对啊,为什么D选项不对
发表于 2022-04-14 06:53:38 回复(0)
D说nm呢,ab一样,bc不一样,问nm的abc是否一样
发表于 2023-04-14 09:00:50 回复(0)
D也是对的啊。明明a,b锁的是对象实例,c锁的是类啊。这种是考语文阅读理解么
发表于 2021-08-20 14:51:41 回复(0)
其实我明白
非静态方法和this锁的都是对象实例
而静态方法和.Class锁的都是Class对象
所以ab,是一个对象,cd是一个对象,可我总感觉d选项说的有问题,abc方法确实锁的不是一个对象,ab是一个对象,d是另一个对象,个人认为d选项不够严谨
发表于 2021-07-19 18:53:05 回复(1)
a锁实例对象 b锁实例对象,但因为this,所以同一个对象调用时,ab是锁同一个对象 c锁类对象 d锁.class,也是类对象,所以cd锁同一个对象
发表于 2022-07-08 10:41:10 回复(0)
感觉第四个答案有歧义,虽然a、b是同一个对象,但是c不是。
c用的是类锁
发表于 2022-04-26 12:25:42 回复(0)
方法a为同步方法,方法b里面的是同步块,同步方法使用的锁是固有对象this,同步块使用的锁可以是任意对象,但是方法b里面的同步块使用的锁是对象this,所以方法a方法b锁住的是同一个对象方法 c为静态同步方法,使用的锁是该类的字节码文件,也就是Test.class。方法d里面的也是同步块,只不过使用的锁是Test.class所以方法c方法d锁住的是同一个对象
发表于 2022-03-19 22:44:26 回复(0)
this代表对类实例的引用,synchronized修饰的非静态方法,即实例方法,锁住的是对象的实例,被static修饰的方法为类方法,
synchronized修饰静态方法锁住的为Class对象
发表于 2020-05-01 16:31:41 回复(0)
Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:

普通同步方法(实例方法),锁是当前实例对象 ,进入同步代码前要获得当前实例的锁
静态同步方法,锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁
同步方法块,锁是括号里面的对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
D是错的。
同一个对象,分别调用a,b,c三个方法,
a是普通方法,锁住的是当前类的class对象,
b是同步方法块,锁是括号里面的对象。this是调用该方法的对象本身。
c是静态同步方法,锁是当前类的class对象
所以a和c是一样的。
编辑于 2019-10-05 18:43:26 回复(3)
我想知道D选项锁的是this对象还是类对象
发表于 2019-08-26 13:04:24 回复(1)
synchronized修饰非静态方法,锁的是rhis对象,修饰静态方法锁的是Class对象,同步代码块锁的是任意对象。
发表于 2023-07-11 23:04:35 回复(0)
同步锁修饰非静态方法 锁的是this 对象, 同步锁修饰静态方法 锁的是class对象。
发表于 2023-04-29 23:07:15 回复(0)