TypechoJoeTheme

MelodyJerry

统计
登录
用户名
密码
/
注册
用户名
邮箱

一题引出“Java的synchronized锁问题”

2021-04-14
/
0 评论
/
156 阅读
/
正在检测是否收录...
04/14

题目描述

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

public class Test {
    private synchronized void a() {
    }
    private void b() {
        synchronized (this) {
        }
    }
    private synchronized static void c() {
    }
    private void d() {
        synchronized (Test.class) {
        }
    }
}
A 同一个对象,分别调用方法a和b,锁住的是同一个对象
B 同一个对象,分别调用方法a和c,锁住的是同一个对象
C 同一个对象,分别调用方法b和c,锁住的不是同一个对象
D 同一个对象,分别调用方法a、b、c,锁住的不是同一个对象

分析

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

方法a为同步方法,方法b里面的是同步块同步方法使用的锁是固有对象this同步代码块的锁可以是任意对象,但是方法b里面的同步块使用的锁是对象this,所以方法a和方法b锁住的是同一个对象。

方法 c为静态同步方法,使用的锁是该类的字节码文件,也就是Test.class。方法d里面的也是同步块,只不过使用的锁是Test.class,所以方法c和方法d锁住的是同一个对象。

答案

AC

更多

获取当前实例对象(this)锁

  • 同步代码块:

    • synchronized(this)synchronized(类实例对象)
    • 锁的是小括号()中的实例对象
  • 同步非静态方法:

    • synchronized method()
    • 锁的是当前对象的实例对象

获取类锁

  • 同步代码块:

    • synchronized(类.class)
    • 锁是最小括号 () 中的类对象(Class对象)
  • 同步静态方法:

    • synchronized static method()
    • 锁是当前对象的类对象(Class 对象)

其他

  • 有线程访问对象的同步代码块时,另外的线程可以访问该对象的非同步代码块
  • 若锁住的是同一个对象,一个线程在访问对象的同步代码块时,另一个访问对象的同步代码块的线程会被阻塞
  • 若锁住的是同一个对象,一个线程在访问对象的同步方法时,另一个访问对象的同步方法的线程会被阻塞
  • 若锁住的是同一个对象,一个线程在访问对象的同步代码块时,另一个访问对象同步方法的线程会被阻塞反之亦然
  • 同一个类不同对象互不干扰的。
  • 类锁由于也是一种特殊的对象锁,因此表现和上述一致,而由于一个类只有一把对象锁,所以同一个类的不同对象使用类锁将会是同步的。
  • 类锁对象锁互不干扰的。
Java多线程
朗读
赞 · 0
赞赏
感谢您的支持,我会继续努力哒!

三合一收款

下面三种方式都支持哦

微信
QQ
支付宝
打开支付宝/微信/QQ扫一扫,即可进行扫码打赏哦
版权属于:

MelodyJerry

本文链接:

http://melodyjerry.top/index.php/archives/419/(转载时请注明本文出处及文章链接)

评论 (0)
IP信息

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

今日天气

V2EX热门榜

  • 获取失败!

标签云