JUC并发编程初学

news/2024/7/7 21:06:19
  1. 什么是JUC
  2. 进程和线程回顾
  3. Lock锁
  4. 生产者和消费者
  5. 8锁的线程
  6. 集合类不安全
  7. Callable
  8. CountDownLatch、CyclicBarrier、Semaphore
  9. 读写锁
  10. 阻塞队列
  11. 线程池
  12. 四大函数式接口
  13. Stream流式计算
  14. 分支合并
  15. 异步回调
  16. JMM
  17. volatile
  18. 深入单例模式
  19. 深入理解CAS
  20. 原子引用
  21. 可重入锁、公平锁非公平锁、自旋锁、死锁... 

一. 什么是JUC 

java.util.concurrent 包是在并发编程中使用的工具类,有以下三个包:

  • java.util.concurrent
  • java.util.concurrent.atomic
  • java.util.concurrent.locks

二. 进程和线程回顾

  • 进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
  • 线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义,线程可以利用进程所有拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。
白话:
  • 进程:就是操作系统中运行的一个程序,QQ.exe, music.exe word.exe ,这就是多个进程
  • 线程:每个进程中都存在一个或者多个线程,比如用word写文章时,就会有一个线程默默帮你定时自动保存。

Java默认有几个线程? 

  • 2个:main线程、GC线程(垃圾回收线程)

线程对于Java而言:Thread、Runnable、Callable 

Java真的可以开启线程吗? 

  • 开不了,start()方法底层调用的start0()是native本地方法,底层的C++ 
package com.gch.juc;

public class StartDemo1 {
    public static void main(String[] args) {
        new Thread().start(); // 实际上调用的是start0方法
    }
}

并发、并行

  • 并发编程:并发、并行
  • 并发(多线程操作同一个资源)  CPU一核,模拟出来多条线程,快速交替执行。
  • 一个CPU一次只能执行一条指令
  • 并行(多线程操作多个资源)  CPU多核,多个线程可以同时执行;线程池
package com.gch.juc;

public class cpuCores {
    public static void main(String[] args) {
        // 获取CPU的核数
        // CPU密集型、IO密集型
        System.out.println(Runtime.getRuntime().availableProcessors()); // 12
    }
}
  • 并发编程的本质:充分利用CPU的资源,充分的利用处理器的每一个核,以达到最高的处理性能。

线程有几个状态?

wait/sleep区别:

  1. 来自不同的类:wait===>Object      sleep===>Thread

企业当中,让线程休眠会用Thread.sleep吗?

  • 不会,会用TimeUnit这个工具类来操作:

2. 关于锁的释放:有没有释放锁(释放资源) 

  • wait会释放锁
  • sleep睡觉了,抱着锁睡觉,不会释放锁
  • 最主要是sleep方法没有释放锁,而wait方法释放了锁使得其他线程可以使用同步控制块或者方法。
  • sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpuos认为该线程正在工作,不会让出系统资源
  • wait是进入等待池等待,让出系统资源,其他线程可以占用cpu
  • sleep(100L)是占用cpu,线程休眠100毫秒,其他进程不能再占用cpu资源
  • wait100L)是进入等待池中等待,交出cpu等系统资源供其他进程使用,在这100毫秒中,该线程可以被其他线程notify,但不同的是其他在等待池中的线程不被notify不会出来,但这个线程在等待100毫秒后会自动进入就绪队列等待系统分配资源换句话说,sleep(100)在100毫秒后肯定会运行,但wait在100毫秒后还有等待os调用分配资源,所以wait100的停止运行时间是不确定的,但至少是100毫秒。
  • 就是说sleep有时间限制的就像闹钟一样到时候就叫了,而wait()是无限期的除非用户主动notify

 3、使用范围不同

  • wait,notify和notifyAll只能在同步控制方法或同步控制块里面使用

  • sleep可以在任何地方使用。 
synchronized(x){
  //或者wait()
  x.notify()
}

4. 是否需要捕获异常 

  • sleep必须捕获异常 --- throws InterruptedException
  • wait,notify和notifyAll不需要捕获异常 

三. Lock锁(重点)

 

 


http://lihuaxi.xjx100.cn/news/1251442.html

相关文章

基于Java在线云音乐系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

【2023】Redis配置与优化

目录 源码安装redis硬件优化配置参考常用配置示例: 系统及内核优化 操作系统:centos-7.9 redis版本:6.2.12源码安装redis 在此之前先简单的安装一个Redis mkdir /app cd /app wget https://download.redis.io/releases/redis-6.2.12.tar.gz…

Log4j,IDEA文件结构与项目结构,目标文件的定义介绍

文章目录 目录 前言 一、log4j概念介绍 1.什么是log4j? 2.使用log4j的优点? 3.使用log而不用syetem.out.println? 4.常用格式: 二、IDEA文件结构介绍 1.Sources Root: 2.Test Sources Root: 3.Resource Root: 4.Test Resource Root 5.Excluded: 三、目标文件的定义 四、IDEA…

BUUCTF Unencode 1

题目描述&#xff1a; 密文&#xff1a; 89FQA9WMD<V1A<V1S83DY.#<W3$Q,2TM]解题思路&#xff1a; 1、观察密文&#xff0c;尝试Base85、Base91等编码&#xff0c;均失败。 2、结合题目&#xff0c;联想到UUencode编码&#xff0c;尝试后成功&#xff0c;得到flag。 …

使用PlotNeuralNet绘制深度学习网络图的基本操作(二)

使用PlotNeuralNet绘制深度学习网络图的基本操作&#xff08;二&#xff09; 接下来我们利用pycharm来绘制当中我们的神经网络模型架构&#xff0c;目标是直接将.tex文件生成为pdf和png。我在学习的过程中参考了一些学习视频&#xff0c;觉得这个up主讲的还不错&#xff1a; 1…

MySQL - 第2节 - MySQL库的操作

目录 1.创建数据库 2.创建数据库案例 3.字符集和校验规则 3.1.查看系统默认字符集以及校验规则 3.2.查看数据库支持的字符集 3.3.查看数据库支持的字符集校验规则 3.4.校验规则对数据库的影响 4.操纵数据库 4.1.查看数据库 4.2.显示创建语句 4.3.修改数据库 4.4.删…

uniapp和springboot微信小程序开发实战:后端架构搭建之整合swagger实现接口可视化访问调试

文章目录 前言需要依赖工具类实现3.测试类浏览测试总结@Api@ApiOperation@ApiImplicitParams@ApiImplicitParam@ApiParam@ApiResponses@ApiResponseModel注解@ApiModel@ApiModelProperty前言 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 We…

游戏开发日志13(利用PlayerPrefs来存储数据)

为游戏设置一个音量键&#xff0c;可以自由选择背景音乐是否开启&#xff0c;并且保存这个设置。 设计了UI如下&#xff1a; 其中BGM为Toggle&#xff0c;其余四个为Button 在canvas&#xff08;set&#xff09;上添加两个脚本&#xff1a;GameMnue&#xff0c;GameManage p…