Java从放弃到继续放弃

news2024/12/24 0:41:05

并发编程

为什么需要多线程?

由于硬件的发展,CPU的核数增多,如果仍然使用单线程对CPU资源会造成浪费。同时,单线程也会出现阻塞的问题。所以,选择向多线程转变。
多线程的使用使得程序能够并行计算,提高计算速度。也能够异步执行,提供更快的响应速度。

什么是Java多线程并发不安全?

多线程并发不安全是指,由于多个线程并发执行可能导致执行过程中,多个线程抢占一个资源的时候导致的错误。
而Java多线程并发不安全的本质是由于线程本身不具有可见性、原子性、有序性
而Java对于不安全问题的解决方法是,提供了JMM(Java内存模型)来提供按需禁止缓存和编译优化的方法。
这些方法包括:

  • volatile、synchronized和final三个关键字
  • Happens-Before规则

正确利用这些JMM方法,就可以有效的解决上述的不安全问题。

减少多线程的上下文切换
常用的减少上下文切换的执行的方法有:

  • 无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些方法来避免使用锁。如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
  • CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁
  • 使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。

线程池的主要作用

线程池的设计主要是为了管理线程,为了让用户不需要再关系线程的创建和销毁,只需要使用线程池中的线程即可。
同时线程池的出现也为性能的提升做出了很多贡献:

  1. 降低了资源的消耗:不会频繁的创建、销毁线程,线程池中的线程随取随用。
  2. 提高了相应速度:因为线程是已经创建好的线程,所以减少了线程创建的时间。
  3. 提高了线程的可管理性:线程是稀缺资源不能无限制的创建,使用线程池使得线程的数量是可控的。即=
  4. 提供了更强大的功能:线程池还提供了一些功能,比如定时执行、延迟执行、线程存活时间等。

线程池的实现

线程池的实现类是 ThreadPoolExecutor,它的继承性UML类图如下:

在这里插入图片描述
顶层接口Executor提供了一种思想:将任务提交和任务执行进行解耦,用户无需关心如何创建线程,如何调度线程来执行任务,用户只需提供Runnable对象,将任务的运行逻辑提交到执行器中,由Executor框架完成线程的调配和任务的执行部分。

ExecutorSevice增加了一些能力:

  1. 扩充执行任务的能力,补充可以为一个或一批异步任务生成Future的方法
  2. 提供管控线程池的方法,比如停止线程池的运行。

AbstractExecutorService将执行任务的流程串联了起来,保证下层的实现只需关注一个执行任务的方法即可。

ThreadPoolExecutor将会一方面维护自身的生命周期,另一方面同时管理线程和任务,是两者良好的结合从而执行并行任务。

to be continue2024年6月9日10:20:02

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

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

相关文章

MT2092 水温调节

代码&#xff1a; #include <bits/stdc.h> using namespace std; double t1, t2, x1, x2, t0; double y1, y2, t; double tmax 0x3f3f3f3f, ans1, ans2; int main() {cin >> t1 >> t2 >> x1 >> x2 >> t0;y1 x1, y2 x2; // 初始流速赋最…

提升易用性,OceanBase生态管控产品的“从小到大”

2022年&#xff0c;OceanBase发布4.0版本“小鱼”&#xff0c;并首次公开提出了单机分布式一体化这一理念&#xff0c;旨在适应大小不同规模的工作负载&#xff0c;全面满足用户数据库“从小到大”全生命周期的需求。当时&#xff0c;我们所说的“从小到大”主要聚焦于数据库的…

Stable Diffusion 如何写出更优雅的 Prompt

在看了前面的课程后&#xff0c; 相信很多人都会有一个困惑&#xff0c;这个 prompt 咋写… 为什么我写的时候只能憋出来了一个 a girl, a boy, beautify … 再也想不到其他的了&#xff0c; 总感觉是吃了没文化的亏&#xff1f; 这一节课我们就来讲一讲 如何写好 prompt …

JVM (四)GC过程

一。概述 程序计数器、虚拟机栈、本地方法栈都是随线程生灭&#xff0c;栈帧随着方法的进入和退出做入栈和出栈操作&#xff0c;实现了自动的内存清理&#xff0c;因此&#xff0c;内存垃圾回收主要集中于Java堆和方法区中。 GC整体流程示意图&#xff1a; ① 年轻代对象的移动…

【UE5|水文章】在UMG上显示帧率

参考视频&#xff1a; https://www.youtube.com/watch?vH_NdvImlI68 蓝图&#xff1a;

解决生产问题的万能接口(Java编译器API的使用)

文章目录 前言Tool和ToolProvider编译器工具&#xff1a;JavaCompiler文件管理文件&#xff1a;FileObject文件管理器&#xff1a;JavaFileManager 诊断监听器&#xff1a;DiagnosticDemo&#xff1a;allPowerfulInterface具体实现测试 结语 前言 当生产环境出现问题时&#x…

【大模型应用开发极简入门】提示工程一:1. 通过context、task、role文本结构设计有效的提示词、 2. OpenAI的提示词任务示例

文章目录 一. chat_completion函数二. 设计有效的提示词1.上下文1.1. 更多细节的上下文1.2. 让GPT改进上下文 2.任务2.1. 提供足够的任务信息2.2. OpenAI的任务示例语法纠正总结TL;DR概要Python转自然语言计算时间复杂度修复Python bug产生python函数 3.角色 了解LLM和OpenAI A…

【Linux】基础IO [万字之作]

目录 一.重谈文件 二.重谈C文件操作 1.操作 1.文件的打开和关闭 2.文件的读写操作 ​编辑 1.fgetc函数 2.fputc函数 3.fputs函数 4.fgets函数 5.fprintf函数 6.fscanf函数 7.fread函数 8.fwrite函数 三.重谈当前路径 四.系统文件操作接口 1.Open函数 2.write函数 3…

假期抢票难?程序员手写一个超强抢票脚本,轻松购得出行票!

距离五一假期只剩几天的时间&#xff0c;据央视财经报道&#xff0c;从4月17日开始&#xff0c;5月1日的火车票就可以通过铁路12306网站核车站售票窗口购买了&#xff0c;售票通道一打开&#xff0c;5月1日上午的热门目的地车票&#xff0c;几乎瞬间售罄。 有平台预计&#xff…

conda虚拟环境,安装pytorch cuda cudnn版本一致,最简单方式

1、pytorch版本安装&#xff08;卸载也会有问题&#xff09; &#xff08;1&#xff09;版本如何选择参考和卸载 https://zhuanlan.zhihu.com/p/401931724 &#xff08;2&#xff09;对应版本如何安装命令 https://pytorch.org/get-started/previous-versions/ 最简答安装参考…

网络数据包抓取与分析工具wireshark的安及使用

WireShark安装和使用 WireShark是非常流行的网络封包分析工具&#xff0c;可以截取各种网络数据包&#xff0c;并显示数据包详细信息。常用于开发测试过程中各种问题定位。 1 任务目标 1.1 知识目标 了解WireShark的过滤器使用,通过过滤器可以筛选出想要分析的内容 掌握Wir…

海外短剧推广平台的开发策略

在全球文化交融的背景下&#xff0c;海外短剧正逐渐成为观众的新宠。为了满足这一需求&#xff0c;我们提出了“视界无界&#xff1a;海外短剧推广平台”的开发策略。下面&#xff0c;我们将详细介绍这一策略的具体内容。 一、全球化内容策略 我们将积极引进全球各地的优质短…

找不到vcruntime140_1.dll无法继续执行的原因解析及解决方法

在现代的信息化社会中&#xff0c;电脑已经成为我们生活和工作中不可或缺的工具之一。然而&#xff0c;在使用过程中&#xff0c;我们可能会遇到一些问题&#xff0c;其中之一就是电脑缺失vcruntime140_1.dll文件。那么&#xff0c;这个问题到底是怎么回事呢&#xff1f;小编将…

传神论文中心|第11期人工智能领域论文推荐

在人工智能领域的快速发展中&#xff0c;我们不断看到令人振奋的技术进步和创新。近期&#xff0c;开放传神&#xff08;OpenCSG&#xff09;社区发现了一些值得关注的成就。传神社区本周也为对AI和大模型感兴趣的读者们提供了一些值得一读的研究工作的简要概述以及它们各自的论…

负氧离子监测站:打造健康生态的守护者

TH-FZ5随着人们对生活质量和健康水平的要求日益提高&#xff0c;空气质量成为了公众关注的焦点。其中&#xff0c;负氧离子作为空气中的一种重要成分&#xff0c;对人体健康有着显著的影响。负氧离子监测站作为监测空气中负氧离子浓度的专业设备&#xff0c;在现代环境监测和生…

Python 扫雷游戏【含Python源码 MX_010期】

简介&#xff1a; 游戏开始时&#xff0c;玩家会看到一个方格矩阵&#xff0c;其中一些方格下面藏有地雷&#xff0c;而其他方格则是空的。玩家可以通过输入坐标来选择方格&#xff0c;以揭开方格下隐藏的内容。如果揭开的方格下有地雷&#xff0c;则游戏失败&#xff1b;否则…

如何用Java程序实现一个简单的消息队列?

在Java程序中&#xff0c;可以使用内置的java.util.concurrent.BlockingQueue作为消息队列存放的容器&#xff0c;来实现一个简单的消息队列。 具体实现如下&#xff0c;在这个例子中&#xff0c;我们创建了一个生产者线程和一个消费者线程&#xff0c;他们共享同一个阻塞队列…

基于webrtc的媒体流传输工具tl-rtc-file

也不知道是什么意思&#xff0c;天天都有人在微信公众号的后台发&#xff0c;是打算找我兑奖吗&#xff1f; 本文软件是朋友 Eduna 推荐的&#xff0c;因为他觉得好像很好玩的样子。老苏一开始以为 tl-rtc-file 是跟 Snapdrop 一样的局域网文件传输工具&#xff0c;在看了 demo…

Anconda安装

参考: centos7篇---安装anaconda_centos7安装anaconda-CSDN博客 CentOS 7 上安装 Anaconda_centos安装conda-CSDN博客 CentOS7 安装Anaconda 的步骤_centos7安装anaconda-CSDN博客 centos7 如何安装与使用 Anaconda - 码农教程 下载 wget命令 wget https://repo.anaconda…

Flutter鸿蒙终端一体化-天下一统

在前面的文章中&#xff0c;我们了解了如何使用FlutterPage来创建Flutter容器。 Flutter鸿蒙终端一体化-混沌初开 Flutter鸿蒙终端一体化-珠联璧合 语雀 但更多的时候&#xff0c;我们需要的是一种类似FlutterFragment的方式来进行引用&#xff0c;可喜的是&#xff0c;鸿蒙…