一文搞懂 Java 并发那些关键字,看完直呼好家伙!

面试官看了直呼内行,Java多线程与并发系列22道高频面试题解析 前言: 作为一个 Java开发人员,多线程是一个逃不掉的话题,不管是工作还是面试,但理解起来比较模糊难懂,因为多线程程序在跑起来的时候比较难于观察和跟踪。搞懂多线程并发知识,可以在面试的时候和周围人拉开差距,另外自己在编码的时候可以做到心中有数。 另外本人整理收藏了20年多家公司面试知识点整理 ,以及各种Java核心知识点免费分享给大家,我认为对面试来说是非常有用的,想要资料的话请点795983544 暗号优快云。 1、Java 中实现多线程有几种方法 (1)继承 Thread 类; (2)实现 阅读详情

并发是个啥?

在深入了解 Java 并发关键字之前,我们先来聊聊并发的概念。假设你来到一家人气爆棚的奶茶店,店内顾客络绎不绝,每个人都急切地等待着自己的饮品。店员此时就像一个多线程处理器,需要在同一时间内处理多个顾客的订单。一会儿为顾客 A 制作珍珠奶茶,一会儿又为顾客 B 打包水果茶,在不同的任务之间快速切换,同时推进多个流程。这,就是并发在生活中的生动体现。

在 Java 的世界里,并发意味着多个任务看似同时在执行。但实际上,对于单核 CPU 而言,同一时刻只能执行一个任务,只是 CPU 通过快速切换,让我们感觉这些任务是同时进行的。而在多核 CPU 的环境下,多个任务可以真正地并行执行。理解并发的概念,是我们深入学习 Java 并发编程的基石。

Java 并发关键字大揭秘

synchronized:最常用的锁

在多线程环境中,当多个线程需要访问共享资源时,就可能会出现数据不一致的问题。这时候,synchronized关键字就登场了,它就像是奶茶店的排队叫号系统。当一个线程获取到了synchronized锁,就如同拿到了排队号码,拥有了访问共享资源的权限,可以放心地执行被synchronized修饰的代码块,而其他线程则必须在外面耐心等待,直到该线程释放锁。

public class SynchronizedExample {
    // 共享资源
    private static int count = 0;
    // 被synchronized修饰的方法,相当于加了排队锁
    public static synchronized void increment() {
        count++;
    }
    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                increment();
            }
        });
        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                increment();
            }
        });
        thread1.start();
        thread2.start();
        // 等待两个线程执行完毕
        thread1.join();
        thread2.join();
        System.out.println("Count: " + count);
    }
}

在上述代码中,increment方法被synchronized修饰,这就保证了在同一时刻,只有一个线程能够进入这个方法执行count++操作。无论有多少个线程尝试调用increment方法,都必须按照顺序排队等待,从而避免了count变量在多线程环境下出现数据竞争和不一致的问题。

volatile:保证可见性

volatile关键字解决的是多线程之间的可见性问题。简单来说,就是当一个线程修改了被volatile修饰的变量时,其他线程能够立即看到这个修改。我们还是以奶茶店为例,volatile就像是奶茶店的广播系统,一旦有新消息(变量值改变),就会立刻通过广播通知所有线程。

public class VolatileExample {
    // 被volatile修饰的变量,保证多线程可见性
    private static volatile boolean flag = false;
    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            while (!flag) {
                // 线程1一直循环,直到flag变为true
            }
            System.out.println("Thread 1: flag is true, stopping loop.");
        });
        Thread thread2 = new Thread(() -> {
            try {
                Thread.sleep(1000);
                flag = true;
                System.out.println("Thread 2: setting flag to true.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        thread1.start();
        thread2.start();
    }
}

在这个例子中,flag变量被volatile修饰。当thread2在睡眠 1 秒后将flag设置为true时,thread1能够立即感知到这个变化,从而停止循环。如果没有volatile关键字,thread1可能永远无法得知flag的改变,导致程序出现逻辑错误。

final:不变的承诺

final关键字用于修饰变量、方法和类,它表达了一种 “不变” 的语义。当final修饰变量时,该变量就成为了常量,一旦赋值就不能再被修改;当修饰方法时,该方法不能被重写;当修饰类时,该类不能被继承。我们可以把final关键字想象成奶茶店的固定菜单,一旦确定就不能更改。

public class FinalExample {
    // 被final修饰的常量,不能再被修改
    public static final int MAX_COUNT = 100;
    // 被final修饰的方法,不能被重写
    public final void printMessage() {
        System.out.println("This is a final method.");
    }
}

在上述代码中,MAX_COUNT常量的值固定为 100,任何试图修改它的操作都会导致编译错误。printMessage方法也不能被其他类重写,保证了方法行为的一致性和稳定性。

总结

通过以上介绍,我们对 Java 并发编程中的几个关键关键字synchronized、volatile和final有了更深入的理解。synchronized通过加锁机制保证了多线程环境下共享资源的安全访问,就像排队叫号一样有序;volatile确保了变量在多线程之间的可见性,如同广播系统及时传递消息;final则通过 “不变” 的特性,为程序的稳定性和安全性提供了保障。

掌握这些关键字是我们在 Java 并发编程道路上的重要一步。在实际开发中,合理运用这些关键字,能够帮助我们编写出高效、稳定且线程安全的代码。希望大家在学习和实践中不断积累经验,成为 Java 并发编程的高手!下次遇到并发问题,你就可以自信满满地说:“这我熟!”

B 站, YYDS!看了这些 Java视频,我直呼好家伙!!! 众所周知, B 站在一般人眼中就是看看小姐姐跳舞的娱乐网站,但是,在和我一样爱学习的小伙伴眼中那就是名副其实的学习宝藏!甚至说,很多小伙伴在读研期间几乎都是通过 B 站上的免费课程进行自学的。 上次写了2021 最新的 Java 后端学习路线之后,我就一直想着要整理一份 Java 优质视频。 预告一下:最新一版更全面、内容安排更合理的 Java 后端学习路线即将到来! 奈何熬夜多了,记性不行,一直拖到现在。直到前天晚 B 站崩了这么久,我才想起来。 于是乎,昨晚,我花了几个小时,整理了一.. 阅读详情

相关推荐

集合的生产力工具类:Collections,我直呼好家伙。。

Collections 是 JDK 提供的一个工具类,位于 java.util 包下,提供了一系列的静态方法,方便我们对集合进行各种骚操作,算是集合框架的一个大管家。 PS:star 这种事,只能求,不求没效果,铁子们,《Java 程序员进阶之路》在 GitHub 上已经收获了 556 枚星标,铁子们赶紧去点点了,冲 600 star! https://github.com/itwanger/toBeBetterJavaer 还记得我们前面讲过的 Arrays 工具类吗?可以回去温习下。 Collect

沉默王二 2522

二面京东被问到Java 反射,我直呼好家伙,这我不是必过吗?

二面京东被问到Java 反射,我直呼好家伙,这我不是必过吗?用多久我会升职加薪、当上技术总监、迎娶漂亮学姐、走上人生巅峰!想想还有点小激动。 好了开始分享面试经历 说说你反射的理解 到底什么是反射呢??? 反射的核心就是JVM在运行时才动态加载类或调用方法,访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。 每一个类都会产生一个对应的Class对象,也就是保存在.class文件。 所有类都是在对其第一次使用时,动态加载到JVM的,当程序创建一个对类的静态成员的引用时,就会加载这个类,Clas

wj1314250的博客 1万+

新手必看:Infineon Memtools烧录配置全流程(附常见错误解决方案)

本文为嵌入式开发新手提供了Infineon AURIX开发环境搭建与Memtools烧录的全流程实战指南。详细解析了ADS、DAS和Memtools三大核心工具的角色与协同关系,并重点讲解了Memtools的图形界面配置步骤、烧录操作流程,以及针对“无法连接设备”、“编程失败”等常见错误的系统性排查与解决方案,帮助开发者快速上手并规避典型陷阱。

weixin_29189377的博客 636

java面试个人优点,看完直呼内行

一.java基础面试知识点 java中==和equals和hashCode的区别 int、char、long各占多少字节数 int与integer的区别 探探对java多态的理解 String、StringBuffer、StringBuilder区别 什么是内部类?内部类的作用 抽象类和接口区别 抽象类的意义 抽象类与接口的应用场景 抽象类是否可以没有方法和属性? 接口的意义 泛型中extends和super的区别 父类的静态方法能否被子类重写 进程和线程的区别 final,finally,finaliz.

m0_58591044的博客 1882

KiCad自动布线实战:FreeRouting插件安装与使用指南

在PCB设计流程中,布线环节往往占据大量重复性工作,尤其对于中小型双面板,成百上千条飞线的手动连接既繁琐又易出错。自动布线技术通过算法在给定设计规则和元件布局的基础上自动规划走线路径,能显著提升布线效率。FreeRouting作为一款开源自动布线器,与KiCad通过DSN/SES标准中间格式无缝配合,让工程师将精力集中于关键信号和布局优化,而将常规网络交给工具处理。本文从自动布线的原理与边界出发,讲解了FreeRouting的安装、DSN导出、参数设置、自动布线及结果回传的完整流程,并结合实际案例展示了在S

weixin_32025789的博客 283

MAC M1用户必看:UTM虚拟机安装Win11全流程避坑指南(附驱动下载)

本文为MAC M1用户提供UTM虚拟机安装Win11的完整指南,涵盖镜像准备、驱动优化及性能调优等关键步骤。特别针对TPM 2.0验证、网络连接等常见问题提供解决方案,帮助用户高效运行Windows 11 ARM版。

weixin_29204205的博客 342

并发编程|连小白都能听懂的“synchronized”关键字讲解,面试官直呼好!

并发编程|连小白都能听懂的“synchronized”关键字讲解,面试官直呼好!

2301

【万字长文】学习Armv8架构虚拟化一篇就够了

这里我们将介绍一些基础的Hypervisor和虚拟化的理论知识。如果你已经有一定的基础或是已经熟悉了这些概念,可以跳过这部分内容。我们用Hypervisor这个词来定义一种负责创建,管理以及调度虚拟机(Virtual Machines, VMs)的软件。Stage 2 转换允许Hypervisor控制虚拟机的内存视图。具体来说,其可以控制虚拟机是否可以访问特定的某一块物理内存,以及该内存块出现在虚拟机内存空间的位置。这种能力对于虚拟机的隔离和沙箱功能来说至关重要。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 5321

java面试问遇到的技术难点,死磕,看完直呼内行

脑图集结理完知识了,补一补漏洞JAVA并发编程实践.PDFJAVA并发编程实践.PDF1.1 进程和多线程的概念及线程的优点1.2 使用多线程1.3 currentThread()方法1.4 isAlive()方法1.5 sleep()方法1.6 getId()方法1.7 停止线程1.8 暂停线程1.9 yield方法1.10 线程的优先级1.11 守护线程2.1 synchronized同步方法2.2 synchronized同步语句块2.3 volatile关键字。

2301_82257317的博客 577

CentOS 7 常用命令大全

CentOS中Linux命令

m0_63075763的博客 2019

STEP 7-Micro/WIN SMART 编程软件:从入门到精通的使用指南

通过不断实践,熟悉软件的各项功能和操作技巧,工程师可更好地应对工业自动化控制中的各种挑战,开发出高效、稳定的控制程序。项目的基本组件是构成程序的核心元素,包括:程序块(主程序 OB1、子程序和中断程序)、数据块(给 V 存储器赋初值)、系统块(硬件组态和参数设置)、符号表(用符号代替存储器地址,使程序更易理解)以及状态图表(监视、修改和强制变量状态)。下载程序时,单击工具栏上的 “下载” 按钮,在弹出的下载对话框中选择要下载的块(程序块、数据块、系统块),单击 “下载” 即可。

电工 5576

java下载文件夹下所有文件,看完直呼内行

并发编程三大特性 原子性 一个操作或者多次操作,要么所有的操作全部都得到执行并且不会受到任何因素的干扰而中断,要么所有的操作都执行,要么都不执行。 对于基本数据类型的访问,读写都是原子性的【long和double可能例外】。 如果需要更大范围的原子性保证,可以使用synchronized关键字满足。 可见性 当一个变量对共享变量进行了修改,另外的线程都能立即看到修改后的最新值。 volatile保证共享变量可见性,除此之外,synchronized和final都可以 实现可见性。 synchronized:

m0_57541165的博客 545

PyTorch实战(20)——生成对抗网络(Generative Adversarial Network,GAN)

自生成对抗网络 (Generative Adversarial Network, GAN) 提出以来,一直是一个活跃的研究和开发领域。本节探索了 GAN 的基本概念,重点解析了其两大核心组件——生成器与判别器的架构设计,深入阐述了 GAN 模型的整体工作机制,并使用 PyTorch 从零开始实现了深度卷积生成对抗网络 (Deep Convolutional GAN, DCGAN)。

盼小辉丶的博客 3588

从死锁到性能飙升:Java 并发编程的5 个颠覆性解决方案,看完直呼通透

今天,我们就来拆解并发编程中的核心痛点,分享几个经过实践验证的解决方案,帮你避开 90% 的常见坑。曾经处理过一个订单系统的死锁问题,通过 jstack 发现两个线程分别持有订单锁和库存锁,却互相等待对方释放,最终通过按资源 ID 排序获取锁的方式彻底解决,系统稳定性提升 90%。在一个分布式任务调度系统中,使用 Semaphore 控制同时执行的任务数,结合 CountDownLatch 等待所有任务完成,既保证了资源不被耗尽,又提高了任务执行效率。

weixin_44075173的博客 438

人工智能训练师三级补贴3120元申领全攻略|条件+流程+五省市对比

补贴是真的,但不是"白给"的。你需要满足社保、户籍、时间等条件,严格按照流程操作。记住四件事先确认自己是否满足条件,再报名——别考完了才发现领不到紧缺工种补贴更高——确认你所在城市是否在紧缺目录中证书下发后12个月内申请——设个日历提醒材料准备齐全再提交——避免来回折腾如果你正在考虑考人工智能训练师三级证书,想要从报名到备考到拿证到申领补贴的完整一站式指南,欢迎查看我的付费专栏:📖《人工智能训练师三级·从零到拿证完全指南》80篇系统化内容,覆盖报名、备考、冲刺、拿证全流程。

白话机器学习 1536

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java的主要优点是,看完直呼内行

前言 “大专人大专魂,大专都是人上人” 当我看到这句话突然就在各个平台火了之后,又开始涌现出了一批又一批抨击专科的网友。 其中有一条评论我记忆犹新:大专生努力做什么都行,就是别做程序员了,别祸害IT届拉低档次了。看完这条评论时我实在耐不住心情促使我敲出这篇文章。作为一个专科毕业成为程序员的人,我发现大家对专科生当程序员这件事恶意满满,不少人说大专能当程序员?大专能进大厂?大专出身,做Java程序员真的没有春天吗? Java基础(对象+线程+字符+接口+变量+异常+方法) 面向对象和面向过程的区别? Jav

206

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

双非渣本Java四年磨一剑,看完直呼内行

01 阿里中间件(四面,Java岗) 1.1 Java中间件一面 技术一面考察范围 重点问了Java线程锁:synchronized 和ReentrantLock相关的底层实现 线程池的底层实现以及常见的参数 数据结构基本都问了一遍:链表、队列等 Java内存模型:常问的JVM分代模型,以及JDK1.8后的区别,最后还问了JVM相关的调优参数 分布式锁的实现比较技术 一面题目 自我介绍 擅长哪方面的技术? java有哪些锁中类?(乐观锁&悲观锁、可重入锁&Synchroni

m0_57983911的博客 95

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

CopyOnWriteArrayList 你了解多少?,看完直呼内行

从 JDK1.5 开始 Java 并发包里提供了两个使用机制实现的并发容器,分别是和。从名字上看,主要针对动态数组,一个线程安全版本的 ArrayList!而主要针对集,可以理解为HashSet线程安全的操作类,我们都知道HashSet基于散列表HashMap实现,但是并不是基于散列表实现,而是基于动态数组实现!关于这一点,我们可以从它的源码中得出结论,部分源码内容:从源码上可以看出,默认初始化的时候,实例化了类,的大部分方法,例如addremove等方法都基于实现!两者最大的不同点是,

2401_84148942的博客 744

java最新版本安装,看完直呼内行

专题1:JavaOOP 1、什么是B/S架构?什么是C/S架构 2、Java都有哪些开发平台? 3、什么是JDK?什么是JRE? 4、Java语言有哪些特点 5、面向对象和面向过程的区别 6、什么是数据结构? 7、Java的数据结构有哪些? 8、什么是OOP? 9、类与对象的关系? 10、Java中有几种数据类型 11、标识符的命名规则。 12、instanceof关键字的作用 13、什么是隐式转换,什么是显式转换 14、Char类型能不能转成int类

m0_57541165的博客 288

javagui程序开发工具,看完直呼内行

Java基础 JDK 和 JRE 有什么区别? == 和 equals 的区别是什么? 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什么作用? java 中的 Math.round(-1.5) 等于多少? String 属于基础的数据类型吗? java 中操作字符串都有哪些类?它们之间有什么区别? String str="i"与 String str=new String(“i”)一样吗? 如何将字符串反转? String 类的常用方

m0_56830725的博客 184
上一篇: 一文读懂 Java 数据结构与算法:从菜鸟到大神的蜕变
下一篇: Java 架构中的缓存秘籍:实现、问题与解决之道
程序员职业指南
博客等级 码龄4年 2139粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值