JUC系列(二) | 回顾Synchronized关键字

简介: JUC系列(二) | 回顾Synchronized关键字

微信截图_20220524215755.png


多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!!

沉下去,再浮上来,我想我们会变的不一样的。

讲Lock接口之前先让我们一起来回顾一下Synchronized关键字吧。我想我们学Java开发这么久,不可能还有那个小伙伴没有用过synchronized


封面是庞大的朋友圈贡献的


JUC系列

正在持续更新中...


一、synchronized 作用范围:


synchronized 是 Java 中的关键字,是一种同步锁。它修饰的对象有以下几种:


  1. 修饰某一处代码块,被修饰的代码块称为同步语句块。作用范围就是{}之间。作用的对象是调用这个代码块的对象。


synchronized (this){
  System.out.println("同步代码块 ");
}


  1. 修饰在方法上,被修饰的方法就称为同步方法。作用范围则是整个方法。作用的对象则是调用这个方法的对象。


public synchronized void sale() {
}


  1. :1)synchronized 关键字不能被继承,如果父类中某方法使用了synchronized 关键字,字类又正巧覆盖了,此时,字类默认情况下是不同步的,必须显示的在子类的方法上加上才可。当然,如果在字类中调用父类中的同步方法,这样虽然字类并没有同步方法,但子类调用父类的同步方法,子类方法也相当同步了。


  1. . 修饰某个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象


public static synchronized void test(){
    }


  1. 修饰某个类,其作用的范围是 synchronized 后面括号括起来的部分,作用的对象是这个类的所有对象


class Ticket {
    public void sale() {
        synchronized (Ticket.class) {
        }
    }
}


二、案例:


最后:我们拿synchronized 写一下多线程中的卖票的经典案例:


public class SynchronizedDemo {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        }, "A").start();
        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        }, "B").start();
        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        }, "C").start();
    }
}
class Ticket {
    //票数
    private int number = 30;
    //操作方法:卖票
    public synchronized void sale() {
        //判断:是否有票
        if (number > 0) {
            System.out.println(Thread.currentThread().getName() + " : " + (number--) + " " + number);
        }
    }
}


三、总结:


synchronized 的同步效率非常低,因为一个如果某一块代码被synchronized 修饰了,当某一个线程进入了synchronized 修饰的代码块,那么其他线程只能一直等待,等待获取锁的线程释放锁,才能进入再次进入同步代码块。


获取锁的线程释放锁的情况只有两种:


  1. 正常执行完,然后释放锁。


  1. 执行过程中,发生异常,JVM让线程自动释放锁。


那么你试想一个如果获取到锁的这个线程,由于一些等待IO原因或其他原因被堵住了,但是又不能释放锁,其他线程就只能在synchronized的门口看着啦,你想一下这个效率吧,出现一次,可能就把人心态玩没啦哈。😂


因此非常需要有一种机制能够不让等待的线程一直无限期的等待下去,比如改成等待一段时间或者响应中断,该怎么做呢?


我们可以通过Lock来做这件事情。


四、自言自语


关于Lock的知识点就在下一篇文章中哦。


最近又开始了JUC的学习,感觉Java内容真的很多,但是为了能够走的更远,还是觉得应该需要打牢一下基础。


最近在持续更新中,如果你觉得对你有所帮助,也感兴趣的话,关注我吧,让我们一起学习,一起讨论吧。


你好,我是博主宁在春,Java学习路上的一颗小小的种子,也希望有一天能扎根长成苍天大树。


希望与君共勉😁


待我们,别时相见时,都已有所成



目录
相关文章
|
供应链 JavaScript 安全
SBOM概念和Java生成方式
SBOM概念和Java生成方式
|
Web App开发
Mac 技术篇-触控板双指前进后退手势设置方法,mac关闭chrome浏览器双指返回手势实例演示
Mac 技术篇-触控板双指前进后退手势设置方法,mac关闭chrome浏览器双指返回手势实例演示
2847 0
Mac 技术篇-触控板双指前进后退手势设置方法,mac关闭chrome浏览器双指返回手势实例演示
|
云安全 人工智能 弹性计算
安装Docker 配置阿里云镜像加速
安装Docker,配置环境,配置阿里云镜像加速地址,查看镜像,卸载docker,卸载docker引擎,主机上的映像、容器、卷或自定义配置文件不会自动删除。要删除所有映像、容器和卷的方法
3232 0
安装Docker 配置阿里云镜像加速
分享一下基于autojs4的悟空浏览器的代码
分享一下基于autojs4的悟空浏览器的代码
413 1
|
SQL Oracle 关系型数据库
Oracle的LAG和LEAD分析函数
Oracle的LAG和LEAD分析函数
833 1
Oracle的LAG和LEAD分析函数
|
小程序 程序员 定位技术
微信小程序开发:集成腾讯地图的步骤
在微信小程序开发的时候,会避免不了的使用腾讯送的大礼包,从微信支付到腾讯地图,一条龙的服务,不得不说鹅厂的实力,但是话又说回来了,鹅厂的官方API真是不敢恭维,尤其是微信小程序开发文档,如果不熟悉的话,真的是大坑不断,连环坑不断,无力吐槽。本篇博文来说说微信小程序开发的时候集成实现腾讯地图的功能,虽然微信官方API介绍了集成步骤,但是还是会给小白带来云里雾里的感觉,接下来就详细来说说具体的集成步骤,分享出来。
568 0
微信小程序开发:集成腾讯地图的步骤
珍藏已久的 OS 学习网站拿出来分享给大家(三)
平常经常看推荐各种资源教程的,感觉有很多文章稂莠不齐,这次我来推荐点硬核的网站,包你有收获。 一般很少有人推荐操作系统的网站吧。。。。。。这几个网站来源于我平常的学习总结,也有一些是来源于网上优秀的回答,希望这几个网站能够助力你对操作系统有更深的认识。
珍藏已久的 OS 学习网站拿出来分享给大家(三)
|
人工智能 自然语言处理 安全
华为「鸿蒙」出世:全球首个微内核全场景分布式OS,可取代安卓,发布即开源
华为自研的鸿蒙系统究竟有多强大?刚刚,余承东在 HDC 2019 上为我们揭开了它的面纱——鸿蒙 OS,是一个划时代的全新操作系统。
1635 0
华为「鸿蒙」出世:全球首个微内核全场景分布式OS,可取代安卓,发布即开源
|
存储 Kubernetes Java
一起学Golang系列(一)Go语言入门:起源、优势和应用场景
Golang 越来越流行,国内的大厂开始全面拥抱 Go 语言,包括阿里巴巴、京东、今日头条、小米、滴滴、七牛云、360等明星公司, 也包括知乎、轻松筹、快手、探探、美图、猎豹移动等等。同时,创业公司也很喜欢 Go 语言,主要因为其入门快、程序库多、运行迅速,很适合快速构建互联网软件产品。
一起学Golang系列(一)Go语言入门:起源、优势和应用场景
|
供应链 安全 Cloud Native
新华三信息安全与阿里云达成战略合作 联手构建云上云下一张网
近日,新华三信息安全技术有限公司与阿里云计算有限公司签署战略合作协议,正式达成战略合作伙伴关系,联手为企业打造云上云下一张网,支撑客户数字化转型。
1692 0
新华三信息安全与阿里云达成战略合作 联手构建云上云下一张网

热门文章

最新文章