详解Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)——通俗易懂版!!!

本文主要是介绍详解Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)——通俗易懂版!!!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.进程与线程定义

进程包含线程,如一个百度网盘进程,该进程的线程可以有上传,下载。

image-20231208121104691

image-20231207200805774

image-20231207200832796

image-20231207205002628

2.创建线程的三种方式

方式1-继承Thread类

image-20231207204839561

image-20231207204750807

方式2-实现Runnabled接口

image-20231207205315366

1.常规写法

image-20231207205252994

image-20231207205548256

2.匿名内部类写法

image-20231207205417435

方式3-实现Callable接口

image-20231207205638691

image-20231207205747187

image-20231207210349671

示例代码:

image-20231207210052881

f1.get()方法得到call方法的返回值

image-20231207210146651

也就是说当线程执行完后,get()方法才执行,这样才能得到线程执行完后的返回值。

3.Thread的常用方法

image-20231207210613001

示例代码:

1.getName()方法获取线程名称

image-20231207210828069

2.setName(字符串)方法为线程取名

image-20231207210925649

3.构造器super(name)方法为线程取名

image-20231207211047525

4.sleep(毫秒值)线程睡眠

image-20231207211156051

5.join()让当前该线程先执行完,其他线程再执行

image-20231207211342582

image-20231207211616298


4.认识线程安全

image-20231207211700529

image-20231207211724786

5.线程同步(解决线程安全问题)

1.同步代码块(synchronized)

image-20231207212108877

image-20231207212448431

1.对于静态方法,synchronized(类名.class)

image-20231207212509666

2.对于示例方法,synchronized(this)

image-20231207214740211

2.同步方法

image-20231207215241122

image-20231207215358596

synchronized不但可以修饰方法,还可以修饰成员变量、静态变量等。


同步代码块锁的范围更小,性能更好,因为需等待的范围小

image-20231207215343964

3.Lock锁

image-20231207220238082

1.创建锁对象,并多态写法,建议用final修饰

image-20231207215929023

2.加锁和解锁,解锁一定要放在finally里,因为中间代码一旦出错,未解锁的话,该实例的其他线程会一直等待解锁

image-20231207220017017

6.线程通信

wait()、notify()及notifyAll()方法。

image-20231207220343218

image-20231207220349546

image-20231207220559740

示例代码:

image-20231207220835718

image-20231207220909430

image-20231207220921225

7.线程池

定义

image-20231207221029904

创建线程池

image-20231207221230548

方式一

构造器参数描述

image-20231207221500450

参数五任务队列可以是new ArrayBlockingQueue<>(n)表示n个缓存队列,new LinkedBlockingQueue<>()表示可以无限多个队列。任务队列是指线程排队的队列

参数六线程工程可以是Executors.defaultThreadFactory()表示使用默认的线程工程。

参数七任务拒绝策略如果是new ThreadPoolExecutor.AbortPolicy()表示抛异常进行处理。

image-20231207222455774

image-20231207222518758

注意事项

image-20231207222544827

常用方法
1.线程池处理Runnable任务的方法

image-20231207222744292

2.线程池处理Callable任务的方法

image-20231207223936256

示例代码1:处理Runnable线程

image-20231207222909880

线程池并没有死亡

image-20231207223023546

线程池的关闭

image-20231207223204886

创建临时线程

image-20231207223331386

都满了,执行任务策略

image-20231207223521541

示例代码2:处理Callable线程

image-20231207224433064

拒绝策略

image-20231207223807913


方式二-Excutors工具类(创建的线程可定期执行任务)

image-20231207224854067

pool就是线程池对象

image-20231207225149107

注意事项:

image-20231207225408429

image-20231207225334010

8.并发与并行及线程的生命周期

image-20231208121551228

image-20231208121610181

并发的每次处理16个线程,所以说并发和并行同时进行的

image-20231208121649428

image-20231208121936248

image-20231208122220369

sleep方法不会释放锁权限。

image-20231208122228191


9.悲观锁、乐观锁

image-20231208124006594

悲观锁示例代码:

出现了线程安全问题

image-20231208122812916

image-20231208123703869

乐观锁示例代码:

image-20231208124329614

这篇关于详解Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)——通俗易懂版!!!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/543249

相关文章

SpringBoot基于沙箱环境实现支付宝支付教程

《SpringBoot基于沙箱环境实现支付宝支付教程》本文介绍了如何使用支付宝沙箱环境进行开发测试,包括沙箱环境的介绍、准备步骤、在SpringBoot项目中结合支付宝沙箱进行支付接口的实现与测试... 目录一、支付宝沙箱环境介绍二、沙箱环境准备2.1 注册入驻支付宝开放平台2.2 配置沙箱环境2.3 沙箱

Mysql中InnoDB与MyISAM索引差异详解(最新整理)

《Mysql中InnoDB与MyISAM索引差异详解(最新整理)》InnoDB和MyISAM在索引实现和特性上有差异,包括聚集索引、非聚集索引、事务支持、并发控制、覆盖索引、主键约束、外键支持和物理存... 目录1. 索引类型与数据存储方式InnoDBMyISAM2. 事务与并发控制InnoDBMyISAM

StarRocks索引详解(最新整理)

《StarRocks索引详解(最新整理)》StarRocks支持多种索引类型,包括主键索引、前缀索引、Bitmap索引和Bloomfilter索引,这些索引类型适用于不同场景,如唯一性约束、减少索引空... 目录1. 主键索引(Primary Key Index)2. 前缀索引(Prefix Index /

一文详解Nginx的强缓存和协商缓存

《一文详解Nginx的强缓存和协商缓存》这篇文章主要为大家详细介绍了Nginx中强缓存和协商缓存的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、强缓存(Strong Cache)1. 定义2. 响应头3. Nginx 配置示例4. 行为5. 适用场景二、协商缓存(协

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

使用Java发送邮件到QQ邮箱的完整指南

《使用Java发送邮件到QQ邮箱的完整指南》在现代软件开发中,邮件发送功能是一个常见的需求,无论是用户注册验证、密码重置,还是系统通知,邮件都是一种重要的通信方式,本文将详细介绍如何使用Java编写程... 目录引言1. 准备工作1.1 获取QQ邮箱的SMTP授权码1.2 添加JavaMail依赖2. 实现

MyBatis与其使用方法示例详解

《MyBatis与其使用方法示例详解》MyBatis是一个支持自定义SQL的持久层框架,通过XML文件实现SQL配置和数据映射,简化了JDBC代码的编写,本文给大家介绍MyBatis与其使用方法讲解,... 目录ORM缺优分析MyBATisMyBatis的工作流程MyBatis的基本使用环境准备MyBati

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一