Java多线程编程与并发控制策略
Java多线程编程与并发控制策略
大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我想和大家分享一下Java多线程编程与并发控制策略的相关知识,希望对大家有所帮助。
一、Java多线程编程基础
1.1 线程的创建与启动
在Java中,线程可以通过继承Thread类或实现Runnable接口来创建和启动。
// 继承Thread类
class MyThread extends Thread {public void run() {System.out.println("Thread is running");}
}// 实现Runnable接口
class MyRunnable implements Runnable {public void run() {System.out.println("Runnable is running");}
}public class Main {public static void main(String[] args) {MyThread thread1 = new MyThread();thread1.start();Thread thread2 = new Thread(new MyRunnable());thread2.start();}
}
1.2 线程的生命周期
线程在Java中的生命周期包括以下几个阶段:
- 新建(New):线程对象被创建,但尚未调用
start()方法。 - 就绪(Runnable):
start()方法被调用,线程进入就绪状态,等待CPU调度。 - 运行(Running):线程获得CPU资源,开始执行
run()方法。 - 阻塞(Blocked):线程因某些原因(如等待I/O操作)进入阻塞状态。
- 终止(Terminated):线程执行完
run()方法或因异常退出。
二、并发控制策略
2.1 同步(Synchronized)
Synchronized关键字用于保证多个线程访问共享资源时的互斥性,防止数据不一致问题。
class Counter {private int count = 0;public synchronized void increment() {count++;}public synchronized int getCount() {return count;}
}public class Main {public static void main(String[] args) {Counter counter = new Counter();Thread t1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {counter.increment();}});Thread t2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {counter.increment();}});t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Count: " + counter.getCount());}
}
2.2 显式锁(Explicit Lock)
ReentrantLock是Java中的显式锁,提供了比Synchronized更灵活的锁机制。
import java.util.concurrent.locks.ReentrantLock;class Counter {private int count = 0;private final ReentrantLock lock = new ReentrantLock();public void increment() {lock.lock();try {count++;} finally {lock.unlock();}}public int getCount() {lock.lock();try {return count;} finally {lock.unlock();}}
}
2.3 信号量(Semaphore)
Semaphore用于控制同时访问某个特定资源的线程数量。
import java.util.concurrent.Semaphore;class Resource {private final Semaphore semaphore = new Semaphore(3);public void use() {try {semaphore.acquire();System.out.println("Resource in use by " + Thread.currentThread().getName());Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();}}
}public class Main {public static void main(String[] args) {Resource resource = new Resource();for (int i = 0; i < 10; i++) {new Thread(resource::use).start();}}
}
2.4 读写锁(ReadWriteLock)
ReadWriteLock允许多个读操作同时进行,但写操作独占。
import java.util.concurrent.locks.ReentrantReadWriteLock;class SharedData {private int data = 0;private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();public void write(int value) {rwLock.writeLock().lock();try {data = value;} finally {rwLock.writeLock().unlock();}}public int read() {rwLock.readLock().lock();try {return data;} finally {rwLock.readLock().unlock();}}
}
三、并发工具类
3.1 CountDownLatch
CountDownLatch用于让一个或多个线程等待其他线程完成操作。
import java.util.concurrent.CountDownLatch;public class Main {public static void main(String[] args) {CountDownLatch latch = new CountDownLatch(3);for (int i = 0; i < 3; i++) {new Thread(() -> {System.out.println(Thread.currentThread().getName() + " is working");latch.countDown();}).start();}try {latch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("All threads have finished");}
}
3.2 CyclicBarrier
CyclicBarrier用于让一组线程等待至某个状态,然后同时执行。
import java.util.concurrent.CyclicBarrier;public class Main {public static void main(String[] args) {CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("All threads have reached the barrier"));for (int i = 0; i < 3; i++) {new Thread(() -> {System.out.println(Thread.currentThread().getName() + " is working");try {barrier.await();} catch (Exception e) {e.printStackTrace();}}).start();}}
}
总结
Java多线程编程与并发控制是一个复杂而重要的领域。在实际开发中,我们需要根据具体需求选择合适的并发控制策略,确保程序的正确性和性能。通过学习和掌握这些技巧,我们可以更好地应对多线程编程中的各种挑战,为用户提供高效、可靠的应用程序。
相关文章:
Java多线程编程与并发控制策略
Java多线程编程与并发控制策略 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我想和大家分享一下Java多线程编程与并发控制策略的相关知识&am…...
Java爬虫(一)
一、Java爬虫简介 1.1 Selenium Selenium爬虫是一种基于浏览器自动化的爬虫技术,可以模拟用户的操作行为,实现对动态网页的爬取。 1.2 jsoup Jsoup拥有十分方便的api来处理html文档,比如参考了DOM对象的文档遍历方法,参考了CSS选…...
element-plus form表单组件之el-date-picker日期选择器组件
el-date-picker日期选择器组件可根据年,月,日期,时间范围来进行选择,可以自定义日期格式,和样式,还提供多种内置事件。 主要属性如下 属性名说明类型可选值默认值model-value / v-model绑定值,…...
如何与情绪好好相处,真正成为情绪的主人
一、教程描述 若要成为一个聪明的人,就要学会做情绪的主人,而不是被情绪控制自己,为什么要做情绪的主人?至少有以下两个方面原因。 其一,都说,世上还是好人多。可是,为什么你身边没有一个好人…...
RK3588/算能/Nvidia智能盒子:[AI智慧油站」,以安全为基,赋能精准经营
2021年9月,山东省应急管理厅印发了关于《全省危险化学品安全生产信息化建设与应用工作方案(2021-2022 年)》的通知,要求全省范围内加快推进危险化学品安全生产信息化、智能化建设与应用工作,建设完善全省危险化学品安全…...
【眼在手外D435相机支架】
完整UR机械臂的GRCNN抓取网络教程参考以下博客: 【眼在手外D435相机支架】 0. 【机械臂视觉抓取从理论到实战】 GRCNN抓取网络学习1【Jacquard数据集等效制作】GRCNN抓取网络学习2【自制Jacquard数据集训练】GRCNN抓取网络学习3【自制Jacquard数据集模型调优】GRCNN抓取网络学…...
js组合继承
JS组合继承(combination inheritance)是一种常用的继承模式,它通过将原型链和构造函数组合使用来实现继承。 下面是JS组合继承的详细解析和代码示例: 创建父类(基类)的构造函数 function Parent(name) {…...
Spring-kafka消费者消费的一些问题
前言 Spring Kafka 无缝集成了 Spring Boot、Spring Framework 及其生态系统中的其他项目,如 Spring Cloud。通过与 Spring Boot 的自动配置结合,开发者可以快速启动和配置 Kafka 相关的功能。无需编写大量样板代码即可实现 Kafka 的生产和消费功能&…...
【自我提升】提升能量书籍
《原子习惯》 (Atomic Habits) - 詹姆斯克利尔 (James Clear): 核心思想:微小的习惯改变可以带来显著的生活变化。方法: 将大目标拆分为可管理的小习惯。使用“习惯堆叠”技术,将新习惯与已有习惯结合。创建支持性环境,…...
python图像处理库-PIL(Pillow)
PIL库全称为Python Imaging Library,即Python图像处理库,是一个在Python中用于处理图像的非常流行的库。 一、PIL介绍 这个库提供了广泛的文件格式支持、高效的内部表示以及相当强大的图像处理功能。 核心图像库旨在快速访问存储在几种基本像素格式中的数…...
【2024】kafka streams的详细使用与案例练习(2)
目录 前言使用1、整体结构1.1、序列化 2、 Kafka Streams 常用的 API2.1、 StreamsBuilder2.2、 KStream 和 KTable2.3、 filter和 filterNot2.4、 map 和 mapValues2.5、 flatMap 和 flatMapValues2.6、 groupByKey 和 groupBy2.7、 count、reduce 和 aggregate2.8、 join 和 …...
qt 简单实验 读取json格式的配置文件
1.概要 2.代码 //#include "mainwindow.h"#include <QApplication> #include <QFile> #include <QJsonDocument> #include <QJsonObject> #include <QDebug> //读取json数据的配置文件QJsonObject readJsonConfigFile(const QString …...
Docker常用命令与实战示例
docker 1. 安装2. 常用命令3. 存储4. 网络5. redis主从复制示例6. wordpress示例7. DockerFile8. 一键安装超多中间件(compose) 1. 安装 以centOS系统为例 # 移除旧版本docker sudo yum remove docker \docker-client \docker-client-latest \docker-c…...
数据结构(基础知识)
基础概念: 数据:数据是信息的载体,是描述客观事物属性的数,字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合 数据元素:是数据的基本单位,在程序中常作为一个整体来考虑 数据对象&#…...
计算机网络:网络层 - 路由选择协议
计算机网络:网络层 - 路由选择协议 路由器的结构路由选择协议概述自治系统 AS内部网关协议路由信息协议 RIP距离向量算法RIP报文格式收敛问题 开放最短路径优先 OSPF基本工作原理自治系统分区 外部网关协议BGP-4 路由器的结构 如图所示,路由器被分为路由…...
JupyterLab使用指南(六):JupyterLab的 Widget 控件
1. 什么是 Widget 控件 JupyterLab 中的 Widget 控件是一种交互式的小部件,可以用于创建动态的、响应用户输入的界面。通过使用 ipywidgets 库,用户可以在 Jupyter notebook 中创建滑块、按钮、文本框、选择器等控件,从而实现数据的交互式展…...
OpenCV 特征点检测与匹配
一 OpenCV特征场景 ①图像搜索,如以图搜图; ②拼图游戏; ③图像拼接,将两长有关联得图拼接到一起; 1 拼图方法 寻找特征 特征是唯一的 可追踪的 能比较的 二 角点 在特征中最重要的是角点 灰度剃度的最大值对应的…...
css布局之flex应用
/*父 100*/.parent-div {/* 这里添加你想要的属性 */display: flex;flex-direction: row; //行justify-content: space-between; //左右对齐align-items: center;flex-wrap: wrap; //换行}/*中 90 10 */.middle-div {/* 这里添加你想要的属性 */display: flex;flex-direction:…...
树莓派4B设置AP热点步骤
树莓派4B设置AP热点步骤:先进入root模式 预先进行apt-get update 第1步:安装network-manager sudo apt-get install network-manager第2步:安装git apt-get install git apt-get install util-linux procps hostapd iproute2 iw haveged …...
Java程序之百鸡百钱问题
题目: 百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,…...
3大核心优势+4类场景方案:Lenovo Legion Toolkit让游戏本性能释放提升30%
3大核心优势4类场景方案:Lenovo Legion Toolkit让游戏本性能释放提升30% 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolk…...
深度解析JetBrains IDE试用期重置:3种实用方案提升开发效率
深度解析JetBrains IDE试用期重置:3种实用方案提升开发效率 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter JetBrains IDE试用期重置工具是一款开源项目,专为开发者提供重置IntelliJ IDEA、…...
FreeCAD钣金实战:从零到一,用SheetMetal工作台搞定Z型固定片设计与展开
1. 钣金设计与FreeCAD SheetMetal工作台入门 钣金件在机械设计中无处不在,从机箱外壳到支架固定片,几乎每个DIY项目都会用到。传统手工绘制展开图既耗时又容易出错,而FreeCAD的SheetMetal工作台让这个过程变得直观高效。最近我在改造工作室铝…...
如何快速解决Places.js地址自动补全的5个常见错误:终极处理技巧指南
如何快速解决Places.js地址自动补全的5个常见错误:终极处理技巧指南 【免费下载链接】places :globe_with_meridians: Turn any into an address autocomplete 项目地址: https://gitcode.com/gh_mirrors/pl/places Places.js是一个强大的地址自动补全JavaS…...
Qwen3.5-27B入门必看:Web界面操作+curl调用+错误排查全流程
Qwen3.5-27B入门必看:Web界面操作curl调用错误排查全流程 1. 快速了解Qwen3.5-27B Qwen3.5-27B是Qwen官方发布的视觉多模态理解模型,它不仅能够进行文本对话,还能理解图片内容。这个镜像已经在4张RTX 4090 D 24GB显卡的环境下完成部署&…...
FUTURE POLICE惊艳效果:毫秒级语音字幕对齐实战演示
FUTURE POLICE惊艳效果:毫秒级语音字幕对齐实战演示 1. 为什么需要精准的字幕对齐? 在视频制作和多媒体处理中,字幕与语音的同步问题一直是个痛点。传统字幕制作往往需要人工逐句校对,耗时耗力。而普通语音识别技术虽然能生成文…...
【2026年恒生电子春招- 4月2日-第一题- 等差数列模最大值】(题目+思路+JavaC++Python解析+在线测试)
题目内容 某智能手环公司需统计用户在 $ 2024 $ 年 $ 5 $ 月的健康数据,分析用户的步数达标情况。由于部分设备存在数据上报故障,需在分析中排除故障期间的数据。具体表如下: 用户表( $ users $ )存储用户基本信息 $ user_id $ : $ INT $ 类型,主键,用户唯一标识。 $…...
intv_ai_mk11应用场景:金融从业者用其生成监管政策要点摘要、投研报告初稿框架
intv_ai_mk11在金融领域的应用实践:政策摘要与投研报告生成 1. 金融从业者的AI助手需求 金融行业每天需要处理海量的监管政策和市场信息,传统人工处理方式面临三大挑战: 时效性压力:新政策发布后需要快速理解要点信息过载&…...
cv_resnet18_ocr-detection保姆级教程:从安装到批量处理图片文字
cv_resnet18_ocr-detection保姆级教程:从安装到批量处理图片文字 1. 快速上手:5分钟搞定OCR文字检测 你是不是经常需要从图片里提取文字?比如整理扫描的文档、识别截图里的信息,或者处理一堆商品图片上的标签。手动打字太慢&…...
十分钟微调Qwen2.5-7B实战:效果立现,适合新手的完整教程
十分钟微调Qwen2.5-7B实战:效果立现,适合新手的完整教程 1. 准备工作与环境介绍 1.1 为什么选择Qwen2.5-7B进行微调 Qwen2.5-7B是阿里云推出的开源大语言模型,7B参数规模在单卡上就能流畅运行。相比全量微调,使用LoRA技术可以在…...
