【程序员必知必会】线程8锁现象:让你彻底理解synchronized到底锁了什么

我们都知道,不论是在学习、面试和工作中,多线程一直都被视为很重要的一项技术,也是开发人员交流中老生常谈的话题。

相信正在阅读的你,脑海中已经浮现出了多线程的知识。许多小伙伴对于多线程都有这样的困扰:知识一看就会,遇到场景就废。屏幕前的你是否也有这样的困扰呢?

就比如我们都知道synchronized实现同步具体表现为以下三种形式:

  1. 对于普通同步方法,锁是当前实例对象
  2. 对于静态同步方法,锁是当前类的Class对象
  3. 对于同步方法块,锁是synchronized括号里配置的对象

但是一到真实场景中,就难以判断synchronized锁的是谁了。

那么本篇文章,引用了著名的”8锁现象“,每个问题都会附一套代码,来帮助你彻底理解synchronized到底锁了什么,让你不论在多么复杂的场景下,都可以正确地判断锁的是谁。

想深入了解synchronized锁的读者
可以阅读笔者的上一篇作品:synchronized的实现原理与应用&Java对象的内存布局

八锁现象

8锁,就是关于锁的八个问题!

读者可以检验一下自己是否能将这八个问题都答对呢?

问题1

运行下面的代码,两个线程执行,是先打印发消息还是打电话呢?

public class Demo1 {
   
    public static void main(String[] args) {
   
        WeChat weChat = new WeChat();

        new Thread(()->{
   
            weChat.sendMessage();
        },"A").start();

        try {
   
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }

        new Thread(()->{
   
            weChat.call();
        },"B").start();
    }
}

class WeChat{
   
    public synchronized void sendMessage(){
   
        System.out.println("send message");
    }

    public synchronized void call(){
   
        System.out.println("call");
    }
}

答: 先发消息,1秒后打电话

解析:

在这种情况下,synchronized锁的是当前的实例对象,两个方法用的是同一个锁(都是同一个weChat对象),因为线程A先拿到了锁,所以线程A先执行,即先发消息

问题2

在sendMessage方法中添加5秒的延时,运行结果又是怎样的呢?

代码(仅修改了WeChat类的sendMessage方法):

public class Demo2 {
   
    public static void main(String[] args) {
   
        WeChat weChat = new WeChat();

        new Thread(()->{
   
            weChat.sendMessage();
        },"A").start();

        try {
   
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }

        new Thread(()->{
   
            weChat.call();
        },"B").start();
    }
}

class WeChat{
   
    public synchronized void sendMessage(){
   
        try {
   
            TimeUnit.SECONDS.sleep(5);
        } catch <
  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九天漩女

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值