【Java入门指南 Day14: 并发编程:多线程与同步机制】

一、线程的生命周期与状态转换

线程在其生命周期中会经历多个状态,理解这些状态及其转换对于正确使用多线程至关重要。

线程状态

public class ThreadStates {public static void main(String[] args) throws InterruptedException {// NEW:新建状态Thread thread = new Thread(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}});System.out.println("新建状态:" + thread.getState()); // NEW// RUNNABLE:运行状态thread.start();System.out.println("运行状态:" + thread.getState()); // RUNNABLE// TIMED_WAITING:计时等待Thread.sleep(100);System.out.println("等待状态:" + thread.getState()); // TIMED_WAITING// 等待线程结束thread.join();System.out.println("终止状态:" + thread.getState()); // TERMINATED}
}

线程的基本操作

public class ThreadOperations {public static void main(String[] args) {Thread thread = new Thread(() -> {// 检查中断状态while (!Thread.currentThread().isInterrupted()) {// 线程执行的操作System.out.println("线程运行中...");try {Thread.sleep(1000);} catch (InterruptedException e) {// 重新设置中断状态Thread.currentThread().interrupt();}}});thread.start();// 设置优先级thread.setPriority(Thread.MAX_PRIORITY);// 中断线程thread.interrupt();}
}

二、线程池的工作原理与使用

线程池通过重用线程来减少线程创建和销毁的开销。

线程池的创建与使用

public class ThreadPoolExample {public static void main(String[] args) {// 创建固定大小的线程池ExecutorService fixedPool = Executors.newFixedThreadPool(5);// 创建缓存线程池ExecutorService cachedPool = Executors.newCachedThreadPool();// 创建自定义线程池ThreadPoolExecutor customPool = new ThreadPoolExecutor(2,                      // 核心线程数4,                      // 最大线程数60L,                    // 空闲线程存活时间TimeUnit.SECONDS,       // 时间单位new LinkedBlockingQueue<>(100), // 工作队列new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略);// 提交任务customPool.submit(() -> {System.out.println("任务执行中...");return "任务结果";});// 关闭线程池customPool.shutdown();}
}

三、synchronized同步机制

synchronized用于实现线程同步,保证代码块或方法在同一时刻只能被一个线程执行。

synchronized的使用方式

public class SynchronizedExample {private int count = 0;private final Object lock = new Object();// 同步方法public synchronized void increment() {count++;}// 同步代码块public void incrementBlock() {synchronized (lock) {count++;}}// 静态同步方法public static synchronized void staticMethod() {System.out.println("静态同步方法");}// 实际应用示例public void process() {Thread t1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {increment();}});Thread t2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {increment();}});t1.start();t2.start();// 等待线程完成try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("最终计数: " + count);}
}

四、volatile关键字

volatile保证了变量的可见性和有序性,但不保证原子性。

volatile的使用场景

public class VolatileExample {// volatile确保可见性private volatile boolean flag = false;public void writer() {flag = true; // 修改后其他线程立即可见}public void reader() {while (!flag) {// 等待flag变为true}}// 双重检查锁定模式private static volatile VolatileExample instance;public static VolatileExample getInstance() {if (instance == null) {synchronized (VolatileExample.class) {if (instance == null) {instance = new VolatileExample();}}}return instance;}
}

五、原子类

原子类提供了线程安全的操作,无需使用synchronized。

常用原子类操作

public class AtomicExample {// 原子整数private AtomicInteger counter = new AtomicInteger(0);// 原子引用private AtomicReference<String> reference = new AtomicReference<>("initial");// 原子数组private AtomicIntegerArray array = new AtomicIntegerArray(10);public void atomicOperations() {// 增加并获取int value = counter.incrementAndGet();// 比较并设置reference.compareAndSet("initial", "updated");// 数组操作array.getAndAdd(0, 1);}// 复杂的原子操作public void complexAtomicOperation() {counter.updateAndGet(x -> x * 2);counter.accumulateAndGet(10, Integer::sum);}
}

最佳实践建议 💡

  1. 线程创建与管理
    • 优先使用线程池而不是直接创建线程
    • 正确处理线程中断
    • 避免使用Thread.stop()等过时方法
  2. 同步处理
    • 最小化同步范围
    • 优先使用java.util.concurrent包中的工具类
    • 注意死锁预防
  3. 性能优化
    • 合理设置线程池参数
    • 避免过度同步
    • 使用适当的并发容器

常见陷阱提醒 ⚠️

  1. 同步问题
// 错误:非原子操作
private volatile int count = 0;
public void increment() {count++; // 非原子操作
}// 正确:使用原子类
private AtomicInteger count = new AtomicInteger(0);
public void increment() {count.incrementAndGet();
}
  1. 线程池问题
// 错误:使用无界队列
ExecutorService executor = new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>()); // 可能导致OOM// 正确:使用有界队列
ExecutorService executor = new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(1000));
  1. 死锁问题
// 可能导致死锁的代码
public class DeadlockExample {private final Object lock1 = new Object();private final Object lock2 = new Object();public void method1() {synchronized (lock1) {synchronized (lock2) {// 操作}}}public void method2() {synchronized (lock2) {synchronized (lock1) {// 操作}}}
}

并发编程是Java中最复杂的主题之一,正确理解和使用这些概念对于开发高性能、可靠的应用程序至关重要。记住要注意线程安全性、性能和死锁预防。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MVC基础——市场管理系统(四)

文章目录 项目地址六、EF CORE6.1 配置ef core环境6.2 code first6.2.1 创建Database context1. 添加navigation property2. 添加MarketContext上下文七、Authentication7.1 添加Identity7.2 Run DB migration for Identity7.3 使用Identity7.3.1 设置认证中间件7.3.2 设置权限…

java后端环境配置

因为现在升学了&#xff0c;以前本来想毕业干java的&#xff0c;很多java的环境配置早就忘掉了&#xff08;比如mysql maven jdk idea&#xff09;&#xff0c;想写个博客记录下来&#xff0c;以后方便自己快速搭建环境 JAVA后端开发配置 环境配置jdkideamavenMySQLnavicate17…

Edge Scdn用起来怎么样?

Edge Scdn&#xff1a;提升网站安全与性能的最佳选择 在当今互联网高速发展的时代&#xff0c;各种网络攻击层出不穷&#xff0c;特别是针对网站的DDoS攻击威胁&#xff0c;几乎每个行业都可能成为目标。为了确保网站的安全性与稳定性&#xff0c;越来越多的企业开始关注Edge …

CN-fnst::CTF Web

文章目录 ezphpez_pythoncomment_mefilechecker_revengei_am_eeeeeshili ezphp 直接数组绕过, 执行命令 GET: usn[]1&usn1[]1&signenv POST: pwd[]2&pwd1[]2 ez_python file参数任意文件读取 读取源码: ?fileapp.py from flask import Flask, request, render_…

AI自我进化的新篇章:谷歌DeepMind推出苏格拉底式学习,语言游戏解锁无限潜能

各位AI爱好者、技术研究者&#xff0c;大家好&#xff01;今天我们来聊聊一个令人兴奋的AI研究新进展——谷歌DeepMind推出的“苏格拉底式学习”方法。这项研究的独特之处在于&#xff0c;它让AI在没有外部数据的情况下&#xff0c;通过“语言游戏”实现自我进化&#xff0c;这…

《类和对象:基础原理全解析(上篇)》

目录 一、浅谈面向过程和面向对象二、C 中的结构体&#xff08;struct&#xff09;1. C 中 struct 的使用 三、C 中的类&#xff08;class&#xff09;四、类的封装性1. 类成员的权限控制关键字2. 权限控制关键字的使用 五、类的六大默认成员函数介绍六、构造函数1. 使用构造函…

电子应用设计方案-59:智能电动床系统方案设计

智能电动床系统方案设计 一、引言 智能电动床作为一种高端家居产品&#xff0c;旨在为用户提供更加舒适、便捷和个性化的睡眠体验。本方案将详细介绍智能电动床系统的设计架构、功能特点和技术实现。 二、系统概述 1. 系统目标 - 实现床体的多部位电动调节&#xff0c;满足不…

电商环境下的财务ERP系统架构

先介绍一下自己的工作经历&#xff0c;2002年开始进入ERP实施行业&#xff0c;专注于O记EBS系统&#xff0c;正好赶上中国经济和信息化高度发展的阶段&#xff0c;先后实施过很多大国企和民企的大型ERP项目&#xff0c;在实施过程中逐渐对ERP系统的架构、模块设计有更深入的认识…

【WRF教程第3.2期】预处理系统 WPS详解:以4.5版本为例

预处理系统 WPS 详解&#xff1a;以4.5版本为例 WPS 嵌套域&#xff08;WPS Nested Domains&#xff09;USGS 和 MODIS 土地利用重力波拖拽方案静态数据&#xff08;Gravity Wave Drag Scheme Static Data&#xff09;1. 什么是重力波拖拽方案&#xff08;GWDO&#xff09;静态…

在Proteus软件仿真STM32F103寄存器方式PID调速电机

因为电脑中只装了IAR&#xff0c;所以本次编译环境就只能是IAR&#xff0c;所用软件版本是9.32.1。 本次仿真为&#xff0c;纯手写代码&#xff0c;不用任何库&#xff0c;包括启动文件也是手写。 首先是启动文件&#xff0c;该文件是汇编文件&#xff0c;命名为start.s&…

QtitanChart组件——高效、灵活的Qt数据可视化解决方案

在现代应用开发中&#xff0c;数据可视化已经成为不可或缺的一部分。无论是商业分析工具、财务报表、工程图表&#xff0c;还是科学实验数据展示&#xff0c;如何以直观、易理解的方式展示数据&#xff0c;往往决定了软件的可用性与用户体验。对于Qt开发者来说&#xff0c;Qtit…

YOLOv11融合[CVPR2024]Starnet中的star block特征提取模块

YOLOv11v10v8使用教程&#xff1a; YOLOv11入门到入土使用教程 YOLOv11改进汇总贴&#xff1a;YOLOv11及自研模型更新汇总 《Rewrite the Stars》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/abs/2403.19967 代码链接&#xff1a;https://github.com/ma-xu/Rewri…

LabVIEW农机自主导航监控系统

随着现代农业技术的快速发展&#xff0c;自主导航农机的需求日益增加&#xff0c;提高作业效率和减少劳动成本成为农业现代化的关键目标。本文介绍了一个基于LabVIEW的农机自主导航监控系统的开发案例&#xff0c;该系统通过先进的传感器与控制技术&#xff0c;实现农机在田间作…

JAVA:代理模式(Proxy Pattern)的技术指南

1、简述 代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理,以控制对这个对象的访问。通过代理模式,我们可以在不修改目标对象代码的情况下扩展功能,满足特定的需求。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什…

番外篇 | Hyper-YOLO:超图计算与YOLO架构相结合成为目标检测新的SOTA !

前言:Hello大家好,我是小哥谈。Hyper-YOLO,该方法融合了超图计算以捕捉视觉特征之间复杂的高阶关联。传统的YOLO模型虽然功能强大,但其颈部设计存在局限性,限制了跨层特征的融合以及高阶特征关系的利用。Hyper-YOLO在骨干和颈部的联合增强下,成为一个突破性的架构。在COC…

php基础:正则表达式

1.正则表达式 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止&#xff0c;我们前面所用过的精确&#xff08;文本&#xff09;匹配也是一种正则表达式。 在PHP中&#xff0c;正则表达式一般是由正规字…

Postman接口测试:全局变量/接口关联/加密/解密

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 全局变量和环境变量 全局变量&#xff1a;在postman全局生效的变量&#xff0c;全局唯一 环境变量&#xff1a;在特定环境下生效的变量&#xff0c;本环境内唯一 …

vue响应式数据-修改对象的属性值,视图不更新

如图&#xff1a; 一&#xff1a;问题是&#xff1a; 我把数据处理后能console.log()打印出来&#xff0c;但是页面的内容不能同步的更新渲染&#xff1b; 二&#xff1a;要求&#xff1a; 在数组循环列表里面&#xff0c;我点击单个的item按钮时&#xff0c;需要实时加载进度…

configure错误:“C compiler cannot create executables“

执行./configure命令出现如下奇怪的错误&#xff0c;百思不得姐&#xff1a; ./configure命令的日志文件为config.log&#xff0c;发生错误时&#xff0c;该文件的内容&#xff1a; This file contains any messages produced by compilers while running configure, to aid d…

【Java学习笔记】多线程基础

并行&#xff1a;同一时刻&#xff0c;多任务同时进行 多任务分别进行 一、线程相关概念 1.程序 是为完成特定任务、用某种语言编写的一组指令的集合。 简单的说:就是我们写的代码 2.进程 &#xff08;1&#xff09;进程指的就是运行中的程序&#xff0c;比如我们使用QQ,就…