栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

多线程 synchronized 关键字

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多线程 synchronized 关键字

聊聊 synchronized 关键字,到底锁定是什么东西!!!

过一下代码,下面解释:
public class LockDemo {
    public static void main(String[] args) throws InterruptedException {
        Phone phone = new Phone();
            phone.call();
        new Thread(()->{

        }, "张三").start();
        new Thread(()->{
            phone.msg();
        }, "李四").start();
    }
}

class Phone{

    
    public synchronized void call() throws InterruptedException {
        TimeUnit.SECONDS.sleep(2);
        System.out.println("打电话!");
    }
    public synchronized void msg(){
        System.out.println("发短信!");
    }
}

解释一下代码:

1. 新建一个 Phone 类咯,里面有两个被 synchronized 关键字修饰的 function。

2. 然后主线程(main),new 一个 Phone 对象给两个线程去调用(记住啊,new 一个就够了,老婆一个就够了,不要搞太多,因为有些事情太多就会出事情)。

3. 然后在两个线程里面执行同个对象的不同 function,在打电话的 function里面加一个休眠(不要用 Thread.sleep(),这个面试的时候比较装逼,是 JUC 里面的东西)。

执行结果:

猜猜是什么?我猜你会猜错,先别看答案,思考一下。

是先打电话,还是先发短信。

正确答案:

 

其实我猜的是:

1. 发短信

2. 打电话

我个人觉得是主线程里面应该是按顺序来执行的,先是 打电话 ,再是 发信息 没错。

但是打电话里面有 2s 的睡眠时间,按照我们现在的计算机水平,早已经跳到主线程里面的 发信息 来了。

为什么还等打电话执行完再执行发短信啊,这不符合线程的逻辑啊??

带着一百个为什么,“乘风破浪会有时”,其实是 synchronized 关键字搞的鬼。

想理解其中的原理,那么务必要知道 synchronized 是什么?锁的是什么?

synchronized 是什么?为什么会出现这个鬼东西?

这个问题是真的棒,首先有这个问题,你应该要思考一下为什么要有 线程 这个东西。

线程:

线程他是cpu执行的最小单元,一个程序里面有很多个线程。

对于没有学过操作系统读这句话,可能有点懵逼。跟在套环一样啊,一个新知识点套另一个知识点。

今天 可乐 就给你来个简单的解释。

程序就是能在计算机执行的指令呗。不理解其实也没关系,知道他有什么实例就行了,qq程序,微信程序...,不陌生吧。这就是程序。

那一个程序有多个线程又怎么理解。

线程其实也不难理解,一个程序里面肯定要分很多个线程去搞的啦。

例如,你在刷微信朋友圈,那微信朋友圈算是一个线程吧,那总得分一条线程出来聊天那里吧(不然,你刷朋友圈收不到 那些女朋友 发来的信息,那很不符合逻辑)

上面解释完多线程的应用场景还有为什么需要多线程。

那么多线程带来的问题也是不容忽视的,也就是我们所说到的 并发问题 啦。划重点,面试会问。

并发是什么东西?好像有个词跟他挺像,并行?

并发,搞个例子解释下。

12306买票,买过吧哈哈哈。就是这个鬼东西啦。

这个 票 很多人想买,那如果一个时刻里面只剩一张票,那一堆人来,岂不是很乱,明明网站显示仅剩一张票,我购买了,他也购买了,她也购买了?这不瞎搞吗?

这个时候就好像去食堂买饭一样,只剩一个饭盒,大家都冲过去,这打饭阿姨手中这个饭都被人抢烂了。

那这个时候肯定是要排队的啦,一个人慢慢来,排得到(锁)就有,排不到饿饿其实也没很大关系。

并发,就是一个一个来。

并行,顾名思义,那就是同时搞多个东西啦。一边吃饭一边看电视,就是这么个道理哦。

那么解决并发问题,无非就是需要个 排队 还有一把 锁(锁上其他人乱来)。

就好像公共厕所问题一样。排队一个人一个人来,排到的进去拉*要把锁锁上,避免有些人不知道就冲了进去,这还挺不安全。

那么 synchronized 就是有着排队和锁的功能,从而来解决并发问题。

上面的例子在搞过来。

public synchronized void call() throws InterruptedException {
        TimeUnit.SECONDS.sleep(2);
        System.out.println("打电话!");
    }

public synchronized void msg(){
        System.out.println("发短信!");
    }

看第一个函数,虽然她休眠了,你以为他会执行第二个函数。但是只是你以为。

synchronized 就是把这个 phone 对象给锁了,因为先执行 call 函数,两条线程有操作着同一个对象,那必定意味着这个对象需要解锁之后,其他才能使用。这下明白了吧

觉得写得还看的懂的,点个赞,关注一下哈哈哈。想看其他内容欢迎留言,不定期更新。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/666144.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号