【Java】Java核心要点总结:59

news2025/1/11 2:20:17

文章目录

  • 1. 线程的run()和start()有什么区别,为什么不直接调用run()
  • 2. synchronized是什么,以及原理
  • 3. Java中如何实现多线程的通讯和协作
  • 4. Volatile有什么特点,为什么能够保证变量的可见性
  • 5. 为什么说synchronized是一个悲观锁,乐观锁的实现原理是什么,什么是CAS,它有什么特性


在这里插入图片描述

1. 线程的run()和start()有什么区别,为什么不直接调用run()


Java中通过继承 Thread 或实现 Runnable 接口来创建线程,线程是通过 start() 方法启动的,而不是直接调用 run() 方法。下面是它们之间的区别:

start() 和 run() 的区别
调用 start() 方法会启动一个新线程并执行其中的 run() 方法,而直接调用 run() 方法将在当前线程中执行 run() 方法,并不会创建新的线程。

为什么不直接调用 run()
如果直接调用 run() 方法,则该方法就会在当前线程中执行,而不会创建新的线程,这样就失去了多线程的优势。由于 Java 是单继承机制,如果某个类已经继承自其他类,则无法再继承自 Thread 类。因此,通常情况下我们更倾向于实现 Runnable 接口来创建线程,这样可以避免单继承带来的限制。

同时,在使用多线程编程时,我们需要控制线程之间的共享资源,保证线程安全。如果我们直接调用 run() 方法,那么所有线程都是在同一个主线程上运行,共享同一个堆空间和栈空间,容易出现数据竞争和线程安全问题,降低系统的稳定性。

因此,我们应该始终使用 start() 方法来启动一个新线程,而不是直接调用 run() 方法。


2. synchronized是什么,以及原理


synchronized 是 Java 中的一种同步机制,它可以保证在多线程并发执行时共享数据的安全性。

synchronized 关键字可以用于方法或者代码块上,如果使用在代码块上,需要指定一个对象作为锁,该对象可以是任意的 Object 对象。当某个线程要执行 synchronized 方法或者代码块时,必须先获得该锁才能执行,如果其他线程已经获取了锁,那么当前线程就只能等待锁的释放。在方法或者代码块执行完成后,当前线程会自动释放锁。

synchronized 的原理是基于监视器锁(monitor),每个对象内部都存在一个监视器锁(也称为管程),通过这个锁来实现对对象的互斥访问。当线程进入 synchronized 代码块时,线程会尝试获取对象的监视器锁,如果获取到了锁,则说明其他线程没有占用对象资源,当前线程就可以进入临界区然后执行代码;如果无法获取到锁,那么线程就会被阻塞,直到持有锁的线程释放了锁。此外,Java 中的 synchronized 还具有可见性和禁止指令重排序的特性,保证了 volatile 变量的安全性。

synchronized 是通过加锁的方式来实现线程之间的同步,保证了共享变量的可见性、原子性和有序性,避免了多个线程对共享数据产生竞争的问题,保证了多线程程序的正确性。


3. Java中如何实现多线程的通讯和协作


在 Java 中,多线程通信和协作可以使用以下几种方式:

wait()、notify() 和 notifyAll() 方法
这三个方法是在 Object 类中定义的,wait() 是让当前线程等待,直到其他线程调用 notify() 或 notifyAll() 方法才能唤醒,notify() 则是随机选择其中一个等待线程进行通知,notifyAll() 则会通知所有等待线程继续执行。使用这些方法时必须要先获得对象的锁,也就是必须在 synchronized 代码块中使用。

join() 方法
join() 方法让当前线程等待另一个线程执行完后再继续执行,其实现原理也是调用了 wait() 方法。join() 方法通常用于让主线程等待子线程执行完成后再执行,或者等待一组线程全部执行完毕再进行下一步操作。

sleep() 方法
sleep() 方法让当前线程暂停一段时间,以便其他线程有机会执行,但不释放锁。sleep() 方法常用于模拟耗时操作,例如网络请求和计算密集型任务,避免浪费 CPU 资源。

Lock 和 Condition 接口
Java 5 引入了 Lock 和 Condition 接口,它们提供了一种更灵活的并发编程方案,Lock 接口提供了与 synchronized 同样的功能,Condition 接口则相当于 wait() 和 notify() 方法的组合,可以更精细地控制线程间通信和协作。

在实现多线程通讯和协作时,我们需要根据具体情况选择不同的方式,在不同场景下使用合适的方法可以提高程序的效率和稳定性。


4. Volatile有什么特点,为什么能够保证变量的可见性


Volatile 是一个 Java 关键字,用于修饰变量,具有以下特点:

可见性:在一个线程中对 volatile 变量的修改会立即刷新到主内存中,并通知其他线程该变量的值已经被修改,其他线程通过读取该变量时可以获取最新的值。

禁止指令重排序:使用 volatile 修饰的变量赋值后不能保证执行顺序,但能够保证前面的操作一定先于后面的操作执行。也就是说,volatile 变量在赋值后,该语句之前的所有读写操作都完成了,该语句之后的所有读写操作还未进行。

不具有原子性: volatile 并不能保证复合操作的原子性,例如 num++,虽然用 volatile 修饰了 num,但是多个线程同时对它进行自增操作时不能保证结果的正确性。

通过上述特点,可以发现 volatile 能够保证变量的可见性是因为它能够禁止 CPU 和编译器对代码重排,将修改后的值立即刷回主内存,而其他线程读取该变量时必须从内存中获取最新的值,从而保证了可见性。

需要注意的是,虽然 volatile 能够保证变量的可见性和禁止指令重排序,但并不能完全解决并发问题,在一些复合操作或者需要原子性保证的操作中,还需要使用其它的同步机制,例如 synchronized、Lock 和 Atomic 类等。


5. 为什么说synchronized是一个悲观锁,乐观锁的实现原理是什么,什么是CAS,它有什么特性


Synchronized 是一种悲观锁,因为它假定代码段中的多线程竞争非常激烈,所以每个线程都会尝试获得锁。然而,在实际运行过程中,并非所有的代码段都会产生高强度竞争,如果使用 synchronized 占用了锁,而实际上还没有其他线程在竞争该资源,这样就会造成效率的浪费。

乐观锁是另外一种锁的思路,其核心思想是假设并发情况下操作不会出现冲突,即先进行操作,在更新前后比较,如果计算机中值没被别的线程修改,则更新成功;如果值已经被其他线程更新,则需要重试。因此,对于使用乐观锁机制的代码,在低并发的情况下性能较好,但是在高并发的情况下重试次数会增加,导致性能下降。

乐观锁的实现原理可以通过 CAS(Compare and Swap)指令来实现。CAS 是一种无锁算法,它利用处理器提供的原子操作指令,保证了操作的原子性和可串行性。CAS 操作将内存中某个位置的值与一个预期值进行比较,如果相等,那么执行操作,否则啥也不干。因为 CAS 靠的是硬件支持,所以它执行非常快,并且很少有竞争失败的情况。在 Java 中,Atomic 类和 AtomicReference 类就是利用了 CAS 的特性来实现乐观锁。

要点总结

synchronized 是一种悲观锁,乐观锁采用先操作再比较的策略。
乐观锁的性能对并发量和重试次数敏感,适合低竞争代码,不适合高竞争代码。
CAS 是一种无锁算法,保证操作的原子性和可串行性,适用于乐观锁机制的实现。
值得注意的是,在编写并发代码时需要评估功能需求、应用场景和性能等多个方面,选择合适的锁策略和实现机制,进行性能优化和效果提升。




在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/621811.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python开发环境的下载方法

Python开发环境的下载方法 Python是一种高级的编程语言,受到广泛的社区和商业支持。它用于数据分析、人工智能和Web开发等领域,成为业界最流行的编程语言之一。搭建Python开发环境需要安装解释器、编辑器、包管理器和库,下面介绍Python开发环…

chatgpt赋能python:用Python开发在线电影播放网站如何进行SEO

用Python开发在线电影播放网站如何进行SEO 随着人们对于电影、电视剧等视频娱乐的需求日益增长,越来越多的在线电影播放网站涌现出来。作为开发者,如何通过搜索引擎优化(SEO)来使你的在线电影播放网站具有更好的可见度&#xff0…

chatgpt赋能python:如何更新Python库?

如何更新Python库? Python语言已经成为现代编程语言中最受欢迎的一种,它的成功归功于它的灵活性、简洁性和可读性。Python库是它成功的关键,这些库是程序员的基本工具箱,可以更快地编写、测试和部署程序。 然而,Pyth…

多分类问题

目录 多分类问题介绍1 多分类1.1 数据集1.2 数据可视化1.3 逻辑回归的向量化1.3.1 代价函数的向量化1.3.2 梯度的向量化1.3.3 正则化逻辑回归的向量化 1.4 多分类-分类器 1.5 使用分类器进行预测 多分类问题 介绍 在本练习中,我们将使用逻辑回归来识别手写数字&…

python安装使用Flask框架(Vscode)

编译器:VsCode,python3.** 首先安装,在终端输入 pip install flask安装成功后新建文件,app.python,创建一个简单的Web应用。 from flask import Flaskapp Flask(__name__)app.route(/) def hello():return Hello, …

chatgpt赋能python:Python平均值命令在数据处理中的应用

Python平均值命令在数据处理中的应用 Python是一门广泛应用于数据分析和数据处理的编程语言。在数据处理中,我们常常需要计算数据的平均值。Python中提供了多种方法来计算平均值,比如使用内置函数mean()或使用numpy库中的mean()函数等。本文将着重介绍P…

Vue封装API,详细解释。

1、为什么我们要封装API ps: 如果已经有了明确要封装API的需求,直接看第二步。 在没有封装API之前,我们是类似这样使用 axios 的 this.$axios.post(blogArticle/frontList,parms).then((resp) > { this.blogList resp.data, this.blogTota…

【玩转Linux操作】Linux常用文件管理命令

🎊专栏【玩转Linux操作】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题🥰 目录 ​编辑 🎁ctrlc 🎁ctrlu 🎁t…

chatgpt赋能python:Python平均分函数:简介和使用方法

Python平均分函数:简介和使用方法 如果您正在寻找如何计算Python中多个数字值的平均分数的方法,请继续阅读。本文将为您介绍Python中平均分函数的用途和使用方法。 什么是平均分函数? Python的平均分函数是一个计算多个数字值的平均值的函…

分享可以在线录音实时转写的方法

小伙伴们使用过录音记录吗?那知道录音实时转写吗?有没有听说过这个功能呢?它是可以通过语音识别技术,将录音中的信息快速转换为文本,并实现实时显示输出的功能。听起来是不是很有趣?而且它无需任何专业设备…

线程,你是个什么?

线程的基本定义 线程(Thread)是操作系统能够进行运算调度的最小单位,它被包含在进程(Process)中,是进程中的实际运作单位。一个线程可以与同一进程中的其他线程共享进程的全部资源,包括内存、文…

深入浅出讲解闭包及其原理

闭包 什么是闭包? 闭包的概念并不复杂,但是它的定义比较绕(就像平时经常用到它,却又说不出来是什么)。可以在一个作用域中调用函数的内部函数并访问到该函数中的作用域的成员,这就是闭包。给一个建议&…

springboot整合swagger3

目录 一、导入swagger3的依赖二、SwaggerConfig代码的解读三、整体代码四、访问swagger3 一、导入swagger3的依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</versi…

【算法与数据结构】209.长度最小的子数组

文章目录 题目一、暴力穷解法二、滑动窗口法完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 题目 一、暴力穷解法 思路分析&#xff1a;这道题涉及到数组求和&#xff0c;那么我们很容易想到利用两个for循环来写&#xff0c;…

【科技素养题】少儿编程 蓝桥杯青少组科技素养题真题及解析第20套

少儿编程 蓝桥杯青少组科技素养题真题及解析第20套 1、“唐纳德特朗普 (Donald Trump) 曾经是美国总统”是一个 (),“特朗普关于新冠肺炎疫情的不实言论”是一个 ()。 A、事实;事实 B、观点;事实 C、观点;观点 D、事实;观点 答案:D 考点分析:主要考查小朋友们对时事的…

ChatGPT的未来发展

文章目录 1.什么是ChatGPT2.ChatGPT的基础技术3.ChatGPT工作原理4.ChatGPT应用场景5.ChatGPT局限性6.ChatGPT的未来发展 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff…

【严重】vm2 <3.9.18 沙箱逃逸漏洞(存在POC)

漏洞描述 vm2 是一个基于 Node.js 的沙箱环境&#xff0c;可以使用列入白名单的 Node 内置模块运行不受信任的代码&#xff0c;代理对象用于拦截并重定义宿主对象的各种操作。 vm2 3.9.18之前版本中&#xff0c;由于 prepareStackTrace 函数直接由 V8 引擎调用&#xff0c;其…

Linux命令(30)之ps

Linux命令之ps 1.ps介绍 linux命令ps是用来查看系统进程的命令。类似与Windows任务管理器中查看到的进程的功能。 2.ps用法 ps [参数] ps常用参数 参数说明-A显示所有的进程数据-a显示跟当前终端关联的所有进程-u基于用户的格式显示-x显示所有进程&#xff0c;不以终端机来…

chatgpt赋能python:用Python建立600*600画布,打造更好的数据可视化!

用Python建立600*600画布&#xff0c;打造更好的数据可视化&#xff01; 简介 数据可视化是数据分析的重要工具之一&#xff0c;通过可视化工具可以更加直观地展现数据&#xff0c;帮助人们更好地理解数据。而Python语言中的matplotlib库正是其中一款功能强大的数据可视化工具…

如何提升自身 WEB 渗透能力?

前言 web 渗透这个东西学起来如果没有头绪和路线的话&#xff0c;是非常烧脑的。 理清 web 渗透学习思路&#xff0c;把自己的学习方案和需要学习的点全部整理&#xff0c;你会发现突然渗透思路就有点眉目了。 程序员之间流行一个词&#xff0c;叫 35 岁危机&#xff0c;&am…