当前位置: 首页 > news >正文

JUC并发编程

1.什么是JUC

java.util工具包、包、分类
业务:普通业务线程代码 Thread
Runable: 没有返回值、效率相比Callable相对较低。

2.线程和进程

进程:一个程序,QQ.exe Music.exe 程序的集合

一个进程往往可以包含多个线程,至少包含一个!

java默认有几个线程?2个 main GC

线程:开了一个进程Typora,写字,自动保 存(线程负责)

对于java而言:Thread、Runable、Callable

**java可以开启线程吗?**不可以(本地方法,底层C++,java无法操作硬件)

并发、并行

并发(多线程操作同一个资源)

并行(多个人一起走)

  • CPU多核,多线程可以同时执行;线程池

并发编程的本质:充分利用CPU资源

3.Synchronized和Lock

Synchronized和Lock的区别

  • Synchronized内置的Java关键字,Lock是一个Java类
  • Synchronized无法判断获取锁的状态,Lock可以判断是否获取到了锁
  • Synchronized会自动释放锁,Lock必须手动释放锁!如果不释放锁就会–死锁
  • Synchronized线程1(获得锁、阻塞)、线程2(等待,傻傻的等),Lock锁就不一定等待下去。
  • Synchronized可重入锁,不可以中断的,非公平;Lock,可重入锁,可以判断锁,非公平(可以自己设置)。
  • Synchronized适合锁少量的代码同步问题,Lock适合锁大量的同步代码。

4.生产者和消费者

传统的生产者和消费者的问题、防止虚假唤醒

线程也可以唤醒,而不会被通知、中断或超时,即所谓虚假唤醒

if语句只能判断一次,在等待的时候如果另一个线程修改了数据,那么wait后就不会进行if判断了

public class A {public static void main(String[] args) {Data data = new Data();new Thread(()->{for (int i = 0; i < 5; i++) {try {data.increment();} catch (InterruptedException e) {e.printStackTrace();}}},"A").start();new Thread(()->{for (int i = 0; i < 5; i++) {try {data.decrement();} catch (InterruptedException e) {e.printStackTrace();}}},"B").start();new Thread(()->{for (int i = 0; i < 5; i++) {try {data.increment();} catch (InterruptedException e) {e.printStackTrace();}}},"C").start();new Thread(()->{for (int i = 0; i < 5; i++) {try {data.decrement();} catch (InterruptedException e) {e.printStackTrace();}}},"D").start();}
}
class Data{private int number=0;public synchronized void increment() throws InterruptedException {//这里使用while循环,如果使用if判断会出现虚假幻想的现象while (number!=0){this.wait();}number++;System.out.println(Thread.currentThread().getName()+"=>"+number);this.notifyAll();}public synchronized void decrement() throws InterruptedException {//同理while (number==0){this.wait();}number--;System.out.println(Thread.currentThread().getName()+"=>"+number);this.notifyAll();}
}

Lock锁实现生产者消费者的问题,Condition实现精准通知唤醒

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class C {public static void main(String[] args) {Data3 data = new Data3();new Thread(()->{for (int i = 0; i < 5; i++) {data.printA();}},"A").start();new Thread(()->{for (int i = 0; i < 5; i++) {data.printB();}},"B").start();new Thread(()->{for (int i = 0; i < 5; i++) {data.printC();}},"C").start();}
}
class Data3{private int number=1;Lock lock=new ReentrantLock();Condition condition1=lock.newCondition();Condition condition2=lock.newCondition();Condition condition3=lock.newCondition();public  void printA(){lock.lock();try {while (number!=1){//等待condition1.await();}System.out.println(Thread.currentThread().getName()+"=>"+number);number=2;//唤醒所有线程condition2.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public  void printB(){lock.lock();try {while (number!=2){//等待condition2.await();}System.out.println(Thread.currentThread().getName()+"=>"+number);number=3;//唤醒所有线程condition3.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public  void printC(){lock.lock();try {while (number!=3){//等待condition3.await();}System.out.println(Thread.currentThread().getName()+"=>"+number);number=1;//唤醒所有线程condition1.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}

相关文章:

JUC并发编程

1.什么是JUC java.util工具包、包、分类 业务&#xff1a;普通业务线程代码 Thread Runable: 没有返回值、效率相比Callable相对较低。 2.线程和进程 进程&#xff1a;一个程序&#xff0c;QQ.exe Music.exe 程序的集合 一个进程往往可以包含多个线程&#xff0c;至少包含一个…...

概率统计·假设检验【正态总体均值的假设检验、正态总体方差的假设检验】

均值假设检验定义 2类错误 第1类错误&#xff08;弃真&#xff09;&#xff1a;当原假设H0为真&#xff0c;观察值却落入拒绝域&#xff0c;因而拒 绝H0这类错误是“以真为假” 犯第一类错误的概率显著性水平α第2类错误&#xff08;取伪&#xff09;&#xff1a;当原假设H0不…...

如何预测机组设备健康状态?你可能需要这套解决方案

1. 应用场景随机振动[注1]会发生在工业物联网的各个场景中&#xff0c;包括产线机组设备的运行、运输设备的移动、试验仪器的运行等等。通过分析采集到的振动信号可以预估设备的疲劳年限、及时知晓设备已发生的异常以及预测未来仪器可能发生的异常等等。本篇教程会提供给有该方…...

C++类和对象:面向对象编程的核心。| 面向对象还编什么程啊,活该你是单身狗。

&#x1f451;专栏内容&#xff1a;C学习笔记⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;日拱一卒&#xff0c;功不唐捐 文章目录一、前言二、面向对象编程三、类和对象1、类的引入2、类的定义Ⅰ、声明和定义在一起Ⅱ、声明和定义分开Ⅲ、成员变量命…...

CUDA虚拟内存管理

CUDA中的虚拟内存管理 文章目录CUDA中的虚拟内存管理1. Introduction2. Query for support3. Allocating Physical Memory3.1. Shareable Memory Allocations3.2. Memory Type3.2.1. Compressible Memory4. Reserving a Virtual Address Range5. Virtual Aliasing Support6. Ma…...

线程池小结

什么是线程池 线程池其实就是一种多线程处理形式&#xff0c;处理过程中可以将任务添加到队列中&#xff0c;然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过的实现了Runnable或Callable接口的实例对象; 为什么使用线程池 …...

vue3状态管理模式 Pinia

状态管理库 Pinia是Vue的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态 1&#xff1a;安装与使用pinia 1.1 安装语法&#xff1a;npm install pinia1.2 创建一个pinia&#xff08;根存储&#xff09;并将其传递给应用程序 import { createApp } from vue import…...

python基于django的自媒体社区交流平台

自媒体社区平台采用python技术,基于django框架,mysql数据库进行开发,实现了以下功能&#xff1a; 本系统主要包括管理员,用户,商家和普通管理员四个角色组成,主要包括以下功能&#xff1a; 1;前台&#xff1a;首页、需求通告、优质案例、帮助中心、意见反馈、个人中心、后台管理…...

Python中类和对象(2)

1.继承 Python 的类是支持继承的&#xff1a;它可以使用现有类的所有功能&#xff0c;并在无需重新编写代码的情况下对这些功能进行扩展。 通过继承创建的新类称为 “子类”&#xff0c;被继承的类称为 “父类”、“基类” 或 “超类”。 继承语法是将父类写在子类类名后面的…...

SpringMvc入门

Spring与Web环境的集成 1.ApplicationContext应用上下文的获取方式 分析 之前获取应用上下文对象每次都是从容器中获取&#xff0c;编写时都需要new ClasspathXmlApplicationContext(Spring配置文件)&#xff0c;这样的弊端就是配置加载多次应用上下文就创建多次。 在Web项目…...

设计模式之单例模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、单例模式是什么&#xff1f; 单例模式是一种创建型的软件设计模式&#xff0c;在工程项目中非常常见。通过单例模式的设计&am…...

贪心算法(基础)

目录 一、什么是贪心&#xff1f; &#xff08;一&#xff09;以教室调度问题为例 1. 问题 2. 具体做法如下 3. 因此将在这间教室上如下三堂课 4. 结论 &#xff08;二&#xff09;贪心算法介绍 1. 贪心算法一般解题步骤 二、最优装载问题 &#xff08;一&#xf…...

【九宫格坐标排列 Objective-C语言】

一、这个案例做好之后的效果如图: 1.这个下载是可以点击的,当你点击之后,弹出一个框,过一会儿,框框自动消失,这里变成“已安装” 2.那么,我现在先问大家一句话:大家认为在这一个应用里面,它包含几个控件, 3个,哪3个:一个是图片框,一个是Label,一个是按钮, 这…...

Tomcat简介

目录 一、Tomcat简介 二、下载安装Tomcat 三、利用Tomcat部署静态页面 一、Tomcat简介 Tomcat是一个HTTP服务器&#xff0c;可以按照HTTP的格式来解析请求来调用用户指定的相关代码然后按照HTTP的格式来构造返回数据。 二、下载安装Tomcat 进入Tomcat官网选择与自己电脑…...

Python基础及函数解读(深度学习)

一、语句1.加注释单行注释&#xff1a;&#xff08;1&#xff09;在代码上面加注释&#xff1a; # 后面跟一个空格&#xff08;2&#xff09;在代码后面加注释&#xff1a;和代码相距两个空格&#xff0c; # 后面再跟一个空格多行注释&#xff1a;按住shift 点击三次"&am…...

车道线检测-PolyLaneNet 论文学习笔记

论文&#xff1a;《PolyLaneNet: Lane Estimation via Deep Polynomial Regression》代码&#xff1a;https://github.com/lucastabelini/PolyLaneNet地址&#xff1a;https://arxiv.org/pdf/2004.10924.pdf参考&#xff1a;https://blog.csdn.net/sinat_17456165/article/deta…...

GO——接口(下)

接口接口值警告&#xff1a;一个包含空指针值的接口不是nil接口sort.Interface接口http.Handler接口类型断言类型分支接口值 接口值&#xff0c;由两个部分组成&#xff0c;一个具体的类型和那个类型的值。它们被称为接口的动态类型和动态值。对于像Go语言这种静态类型的语言&…...

计算机网络之http02| HTTPS HTTP1.1的优化

post与get请求的区别 get 是获取资源&#xff0c;Post是向指定URI提交资源&#xff0c;相关信息放在body里 2.http有哪些优点 &#xff08;1&#xff09;简单 报文只有报文首部和报文主体&#xff0c;易于理解 &#xff08;2&#xff09;灵活易拓展 URI相应码、首部字段都没有…...

基于matlab使用神经网络清除海杂波

一、前言此示例演示如何使用深度学习工具箱™训练和评估卷积神经网络&#xff0c;以消除海上雷达 PPI 图像中的杂波返回。深度学习工具箱提供了一个框架&#xff0c;用于设计和实现具有算法、预训练模型和应用程序的深度神经网络。二、数据集该数据集包含 84 对合成雷达图像。每…...

每天10个前端小知识 【Day 8】

前端面试基础知识题 1. Javascript中如何实现函数缓存&#xff1f;函数缓存有哪些应用场景&#xff1f; 函数缓存&#xff0c;就是将函数运算过的结果进行缓存。本质上就是用空间&#xff08;缓存存储&#xff09;换时间&#xff08;计算过程&#xff09;&#xff0c; 常用于…...

【项目精选】基于Java的敬老院管理系统的设计和实现

本系统主要是针对敬老院工作人员即管理员和员工设计的。敬老院管理系统 将IT技术为养老院提供一个接口便于管理信息,存储老人个人信息和其他信息,查找 和更新信息的养老院档案,节省了员工的劳动时间,大大降低了成本。 其主要功能包括&#xff1a; 系统管理员用户功能介绍&#…...

Spark SQL 介绍

文章目录Spark SQL1、Hive on SparkSQL2、SparkSQL 优点3、SparkSQL 特点1) 容易整合2) 统一的数据访问3) 兼容 Hive4) 标准的数据连接4、DataFrame 是什么5、DataSet 是什么Spark SQL Spark SQL 是 Spark 用于结构化数据(structured data) 处理的Spark模块。 1、Hive on Spa…...

升级到 CDP 后Hive on Tez 性能调整和故障排除指南

优化Hive on Tez查询永远不能以一种万能的方法来完成。查询的性能取决于数据的大小、文件类型、查询设计和查询模式。在性能测试期间&#xff0c;要评估和验证配置参数和任何 SQL 修改。建议在工作负载的性能测试期间一次进行一项更改&#xff0c;并且最好在生产环境中使用它们…...

理解HDFS工作流程与机制,看这篇文章就够了

HDFS(The Hadoop Distributed File System) 是最初由Yahoo提出的分布式文件系统&#xff0c;它主要用来&#xff1a; 1&#xff09;存储大数据 2&#xff09;为应用提供大数据高速读取的能力 重点是掌握HDFS的文件读写流程&#xff0c;体会这种机制对整个分布式系统性能提升…...

Intel处理器分页机制

分页模式 Intel 64位处理器支持3种分页模式&#xff1a; 32-bit分页PAE分页IA-32e分页 32-bit分页 32-bit分页模式支持两种页面大小&#xff1a;4KB以及4MB。 4KB页面的线性地址转换 4MB页面的线性地址转换 PAE分页模式 PAE分页模式支持两种页面大小&#xff1a;4KB以及…...

Linux常用命令

linux常用命令创建一个目录mkdir 命令可以创建新目录。mkdir 是 make directory 的缩写。[rootiZ2ze66tzux2otcpbvie88Z ~]# ls [rootiZ2ze66tzux2otcpbvie88Z ~]# mkdir web [rootiZ2ze66tzux2otcpbvie88Z ~]# ls web [rootiZ2ze66tzux2otcpbvie88Z ~]# 创建一个文件2.1 在 Li…...

基于STM32设计的音乐播放器

一、项目背景与设计思路 1.1 项目背景 时代进步,科学技术的不断创新,促进电子产品的不断更迭换代,各种新功能和新技术的电子产品牵引着消费者的眼球。人们生活水平的逐渐提高,对娱乐消费市场需求日益扩大,而其消费电子产品在市场中的占有份额越来越举足轻重。目前消费电…...

微服务开发

目录 微服务配置管理 权限认证 批处理 定时任务 异步 微服务调用 (协议)...

【(C语言)数据结构奋斗100天】二叉树(上)

【(C语言)数据结构奋斗100天】二叉树&#xff08;上&#xff09; &#x1f3e0;个人主页&#xff1a;泡泡牛奶 &#x1f335;系列专栏&#xff1a;数据结构奋斗100天 本期所介绍的是二叉树&#xff0c;那么什么是二叉树呢&#xff1f;在知道答案之前&#xff0c;请大家思考一下…...

Java 验证二叉搜索树

验证二叉搜索树中等给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下&#xff1a;节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1&…...

做网站用什么技术好/佛山网站建设十年乐云seo

为什么80%的码农都做不了架构师&#xff1f;>>> 各个功能详解 ●地图 iOS 9的地图应用加入了公共交通导航、支持公交、火车、地铁、轮渡等交通工具&#xff0c;支持全球多个地区&#xff08;包括国内300多个城市&#xff09;。 ●Siri 更“积极”的Siri可以根据用户…...

网站开发语言学习/搜索引擎优化的七个步骤

在小程序开发中&#xff0c;var that this的声明很常见。举个例子&#xff0c;代码如下&#xff01; 示例代码1 //index.js Page({ data: { toastHidden: true, }, loadData: function () { var that this//这里声明了that&#xff1b;将this存在that里面 wx.request…...

wordpress 断点调试/推广文案范例

链接: RecommenderSystem_userCF-itemCF-CB...

万宁网站建设/b站推广app大全

shell 在计算机科学中&#xff0c;Shell俗称壳&#xff08;用来区别于核&#xff09;&#xff0c;是指“提供使用者使用界面”的软件&#xff08;命令解析器&#xff09;。它类似于DOS下的command和后来的cmd.exe。它接收用户命令&#xff0c;然后调用相应的应用程序。 同时它又…...

wordpress老站开启多站点/百度快照搜索引擎

8月17日&#xff0c;“AI上有信仰的云——华为云中国行2018”系列活动将走进杭州这座美丽的城市&#xff0c;为其带来创新技术&#xff0c;激发企业新动能&#xff0c;以云之便利帮助企业拥抱AI&#xff0c;在信息洪流中充分享受数字红利。届时&#xff0c;华为云、生态伙伴和行…...

长沙企业做网站哪家好/app宣传推广方案

患者的白斑在伍德灯照射下显示淡蓝白色荧光反应考虑是早期白癜风&#xff0c;白癜风是一种病症复杂的皮肤顽疾&#xff0c;发病原因繁多&#xff0c;再加上容易跟其混淆的疾病有很多&#xff0c;建议患者做进一步检查&#xff0c;以更准确确定病情&#xff0c;也对白斑的发病情…...