【JUC】Java并发编程从挖坑到入土全解(2)

news/2024/5/17 15:48:26 标签: java, juc, 并发, synchronized,

目录

我们的到底是什么(8个案例)

案例1

案例2

案例3

案例4

案例5

案例6

案例7

案例8

总结


我们的到底是什么(8个案例)

有a、b两个线程,我们基于如下代码进行改造:

java">public static void main(String[] args) {
        Phone phoneA = new Phone();
        new Thread(() -> {
            phoneA.sendEmail();
        }, "a").start();

        try {
            TimeUnit.MICROSECONDS.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() ->
        {
            phoneA.sendSMS();
        }, "b").start();
    }
}

class Phone {
    public synchronized void sendEmail() {
        System.out.println("sendEmail");
    }

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

请依次判断下在如下8个案例下,是先打印“sendEmail”?还是先打印“sendSMS”?

案例1

2个方法都是普通同步方法,方法内无其他逻辑(如下图)

结果:先打印“sendEmail”,再打印“sendSMS”

案例2

打印“sendEmail”的方法中,添加暂停3秒的

结果:(延迟3秒后)先打印“sendEmail”,再打印“sendSMS”

案例3

添加1个普通方法(无synchronized

结果:先打印“hello”,(延迟3秒后)再打印“sendEmail”

案例4

有2个phone(两个线程使用不同的phone对象)

结果:先打印“sendSMS”,(延迟3秒后)再打印“sendEmail”

案例5

2个方法都是静态同步方法,只有一个phone(两个线程使用同一个phone对象)

结果:(延迟3秒后)先打印“sendEmail”,再打印“sendSMS”

案例6

2个方法都是静态同步方法,有2个phone(两个线程使用不同的phone对象)

结果:(延迟3秒后)先打印“sendEmail”,再打印“sendSMS”

案例7

1个方法是静态同步方法,1个方法是普通同步方法,有1个phone(两个线程使用同一个phone对象)

结果:先打印“sendSMS”,(延迟3秒后)再打印“sendEmail”

案例8

1个方法是静态同步方法,1个方法是普通同步方法,有2个phone(两个线程使用不同的phone对象)

结果:先打印“sendSMS”,(延迟3秒后)再打印“sendEmail”

总结

  • 当对方法加synchronized关键字时,的是当前对象(this),所以即使是多线程只要调用的是同一个对象的synchronized方法,就需要串行执行(案例1和案例2),未被synchronized修饰的普通方法则不受影响(案例3)

  • 如果是不同对象则不受影响(案例4),分别在自己的对象上加,不会影响到别的对象

  • 当在带有“static”的方法上加了synchronized关键字时,的是当前类,无论几个对象,都要抢类的这一把,因而是否使用同一对象都会串行执行

  • 对于同步代码块呢,的是sychronized括号的对象


http://www.niftyadmin.cn/n/5032767.html

相关文章

计算机二级python基础题刷题笔记(三)

hello,看到三的小伙伴们你们已经超过30%的对手啦!接下来也要加油呀 代码没有最好,只有更好,如果你有更好的想法答案欢迎在评论区里发表呀 1、将程序里定义好的std列表里的姓名和成绩与已经定义好的模板拼成一段话,显示…

spark 数据倾斜优化总结

一、数据倾斜产生原因 数据倾斜就是部分task承担了过多的计算任务,导致整个stage都被卡。 可能产生数据倾斜的场景如下 操作场景join其中一个表比较小,但key值少join大表与大表,但key值中存在过多的特殊值,如0或nulljoinon条件包…

SQL注入之 无列名注入 原理详解

为什么会需要无列名注入? 我们常用的SQL注入方法是通过information_schema这个默认数据库来实现,可是你有没有想过,如果过滤了该数据库那么我们就不能通过这个库来查出表名和列名。不过我们可以通过两种方法来查出表名: InnoDb引…

【Vue】快速入门案例与工作流程的讲解

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《Vue快速入门》。&#x1f…

ubuntu 18.04 中 eBPF samples/bpf 编译

1. history 信息 一次成功编译 bpf 后执行 history 得到的信息: yingzhiyingzhi-Host:~/ex/ex_kernel/linux-5.4$ history1 ls2 mkdir ex3 cd ex4 mkdir ex_kernel5 ls /boot/6 sudo apt install linux-source7 ls /usr/src/8 uname -r9 cd ex_kernel/10…

刷题统计(蓝桥杯)

刷题统计 问题描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n 题? 输入格式 输入一行包含三个整数 a,b 和 n. 输出格式 输出一个整数代表…

jdk8之Optional类判空处理

文章目录 1 Optional1.1 简介1.2 主要方法讲解1.2.1 Optional对象创建1.2.2 Optional.get()1.2.3 Optional.isPresent()1.2.4 Optional.ifPresent()1.2.5 Optional.filter()1.2.6 Optional.flatMap()1.2.7 Optional.orElse()1.2.8 Optional.orElseGet()1.2.9 Optional.orElseTh…

大型游戏动作竞技游戏开发和体感VR/AR游戏开发:创造引人入胜的虚拟世界

大型游戏动作竞技游戏和体感VR/AR游戏都代表了游戏开发领域的最新趋势。它们提供了高度沉浸式的娱乐体验,结合了视觉、听觉和体感互动。在本文中,我们将探讨如何开发这两种类型的游戏,并介绍其关键特点和开发流程。 大型游戏动作竞技游戏的特…