JavaEE 5 (4/28)

news2024/11/27 21:36:35

1.wait() 和notify()

调用wait后做的三件事

1.释放锁

2.等待其他线程通知

3.收到通知后重新上锁,继续执行 

要想实用wait和notify就得搭配synchronized 获取锁

wait哪个对象就要针对哪个对象加锁

Java中线程是随机抢占式执行的,实际上线程的执行我们一定要有一个顺序.

join可以部分解决这个问题,但是A.join是让一个线程A挤入正在运行的线程B直到A执行完毕,才执行刚才暂停的线程B.

wait和notify都是Object类的方法

调用wait就会使线程陷入阻塞状态

直到其他线程调用notify来通知这个阻塞状态的线程,它才开始执行

2.线程的状态

3.关于多线程的案例

1.实现一个线程安全版本的单例模式

单例模式:是一个设计模式之一,设计模式就是棋谱,一些固定的代码套路

常见的设计模式就是单例模式和工厂模式

单例模式:就是一个类只能有一个实例,不能有多个,在实际开发中是很常见的

单例模式Singleton分为

饿汉模式(饿指的是着急):中午吃饭用了4个碗,吃完饭以后立即把碗给洗了(很着急)

懒汉模式:中午吃饭用了4个碗,吃完饭以后,先不洗.晚上这顿只需要两个碗,然后只洗两个即可,如果明天早上再用一个碗那么只洗一个碗   (很懒,洗的碗树=剩余没洗的-这次要用的)

                懒汉模式比较好,效率更高,不用重复洗碗了

懒汉模式线程不安全,因为多线程的时候,调用get方法的时候,方法内部有读和写的操作,不是原子性        .懒汉模式要加锁,但是不能每次进入这个方法就要加锁,因为线程不安全只可能发生在第一次的读写读操作中,一旦实例了,后面只有两个读,后面就线程安全了,但是每次进入还要有锁操作,代价比较大,所以需要优化着来写

这里解释下为什么两层if一样还要写两次,是因为他们的目的不同,第一次是为了判断是否要加锁的,第二次是为了判断是否要创建一个新的对象实例的. 并且最重要的是在多线程中加了锁以后可能会阻塞,10:00执行的加锁的前面的,可能10:30才执行到加锁的后面的,如果中间过程instance被修改了,那么就需要重新判断,如果不重新判断的话,就一定会创建个对象的实例,就达不到单例模式了

4.阻塞队列

首先

 阻塞队列用在生产者消费者模型中,用于作为他们的交易场所,减少了耦合度

这里解释一下耦合度:如果A和B的耦合度比较高,可以认为它们有直接的联系,如果修改A就要考虑B,同样如果修改B也要考虑A,并且B或者A挂了,可能会导致A或者B挂.

使用生产者消费者模型就能降低耦合

生产者消费者模型中,使用了交易场所

A只需要关注如何与队列交互,不需要关注B

B也是

 生产者消费者模型的优点

1.能够解耦合

2.能够"削峰填谷"

"削峰"就是如果请求量一下增大A的请求只是通过交易场所传给B,A不会有啥大问题,但是如果没有交易场所的话B可能处理不了大量的请求,可能会崩. 如果有交易场所,B就会保护的很好,因为阻塞满了以后不会再入队请求 

"填谷"就是如果请求量回复正常的话,交易场所(阻塞队列)中的请求还在,还会给B进行处理,B还在高速的频率处理着问题

5.指令重排序

volatile 解决了指令重排序和内存可见性问题

synchronized解决了内存可见性和原子性的问题还可以保证禁止指令重排序

6.定时器Timer

实现首先是执行任务的类(Task ),然后是Timer类

Timer类底层的数据结构是堆 PriorityQueue

自定义类型的比较要继承Comparable 接口然后重写compareto

什么时候被唤醒计算出来用wait唤醒

sleep不能中途唤醒,wait能

7.线程池

线程比进程更轻量,但是如果还是存在大量的线程,创建和销毁的代价依然不小

所以我们设计了线程池,线程创建后放到线程池中,需要用的时候从线程池去拿,用完后在放到线程池中。这样快,因为一般线程创建和销毁和使用需要牵涉到“内核态”,它具有不确定性,也就创建你的线程后可能会做其他任务,而如果放入线程池中,使用线程就是“用户态”,它比较可靠,只需完成用户指定的操作即可

一般认为“用户态”比内核态更加高效(具有可控性)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云服务器可以做什么?十大使用场景举例说明

使用阿里云服务器可以做什么?阿里云百科分享使用阿里云服务器常用的十大使用场景,说是十大场景实际上用途有很多,阿里云百科分享常见的云服务器使用场景,如本地搭建ChatGPT、个人网站或博客、运维测试、学习Linux、跑Python、小程…

【2023秋招】2023华为od-4.20三道题

2023大厂笔试模拟练习网站(含题解) www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200道互联网大厂模拟练习题&…

【刷题之路Ⅱ】LeetCode 622. 设计循环队列

LeetCode 622. 设计循环队列 一、题目描述二、解题1、方案1——数组实现,预留一个空判满1.1、成环思路1.2、初始化接口1.3、入队接口1.4、出队接口1.5、取队头接口1.6、取队尾接口1.7、判空接口1.8、判满接口1.9、释放接口 2、方案2——单向循环链表实现&#xff0c…

SpringBoot集成Oracle实战和坑

这里写目录标题 前言1.导包2. 配置文件:数据库信息辟谣 3.代码 问题更新 前言 前段时间搞了一个oracle的项目,耗费了很多时间,现在项目整体上线了,在此记录下实战过程以及遇到的坑,有需要的网友也可以直接拿去使用。 …

文本三剑客正则表达式1

文章目录 文本三剑客&正则表达式11 sort1.1 sort -f1.2 sort -b1.3 sort -n1.4 sort -r1.5 sort -u1.6 sort -t1.7 sort -k1.8 sort -o 2 uniq2.1 uniq -c2.2 uniq -u2.3 uniq -d 3 tr3.1tr -c3.2 tr -d3.3 tr -s :3.4 tr -t 4 cut4.1 cut -d4.2 cut -f4.3 cut -b4.4 cut -…

基于 SpringBoot+Vue 的家政服务管理平台

1. 背景 本系统主要是设计出家政服务管理平台,基于B/S构架,后台数据库采用了Mysql,可以使数据的查询和存储变得更加有效,可以确保家政服务管理的工作能够正常、高效的进行,从而提高工作的效率。总体的研究内容如下&am…

模组uart调试总结

配置驱动选项 1.1 首先通过原理图确定其串口号,比如UART1、UART3_HS,同时查看该串口引脚是否有复用功能,比如用作SIM卡引脚。如果有复用,需要在设备树配置中取消复用功能的选项,然后选中串口功能,高通平台设…

【嵌入式环境下linux内核及驱动学习笔记-(12-设备树操作函数)】

目录 1、设备树对应的数据结构1.1 struct device_node1.2 struct property 2、设备树操作函数2.1 查找字点的函数2.1.1 of_find_node_by_path2.1.2 of_find_node_by_name2.1.3 of_find_node_by_type2.1.4 of_find_compatible_node2.1.5 of_find_node_by_phandle2.1.6 of_get_ch…

Automa爬取网页数据直接入库(四)

介绍 在使用automa浏览器插件爬取数据时,可以直接通过发送请求将爬取到的网页数据持久化到数据库中 本次以360趋势图爬取后插入数据库当做测试 建立流程 首先建立打开360趋势图的流程,这个不再演示,直接从获取分析元素开始 打开要爬取的网页 点击定位元素 建立表格存储爬取…

【shell脚本】免交互操作

免交互操作 一、Here Document免交互1.1免交互概述1.2语法格式1.3实验 二、Expect2.1脚本格式2.2实验 一、Here Document免交互 1.1免交互概述 使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。是标准输入的一种替代品可以帮助…

森海塞尔及诺音曼携重磅新品亮相2023广州国际专业灯光、音响展览会

森海塞尔及诺音曼携重磅新品亮相2023广州国际专业灯光、音响展览会 以卓越产品和创新技术引领专业音频行业发展 广州,2023年5月16日——森海塞尔和诺音曼将于2023年5月22日至25日,携重磅新品及全新音频技术亮相第21届广州国际专业灯光、音响展览会。森海…

十七、Bus消息总线

目录 1、Bus消息总线介绍: 2、使用消息总线实现配置自动更新 2.1、方案一架构图: 2.2、方案二架构图(常用) 3、对springcloud-config-server项目进行改造 3.1、修改springcloud-config-server项目的pom文件,添加…

如何防范鱼叉式网络钓鱼及其他钓鱼攻击

在当今日益互联的世界中,远程访问已成为许多组织允许员工随时随地办公的必要条件。远程访问是一把双刃剑,有自身的优势,但也带来了重大的安全风险。网络犯罪分子一直想方设法利用远程访问系统的漏洞,试图通过这些漏洞发起鱼叉式网…

软件测试行业对新人友好吗?

软件测试真的算是对新人小白非常友好的学科了,但是你也千万不要抱有幻想,觉得轻轻松松就能掌握真正的技能,然后如愿找到高薪工作。从0到1还是需要一个过程的,也是需要你付出相当大的努力去学习的 随着人工智能时代的到来&#xf…

第01讲:RocketMQ入门

一、什么是消息队列 ​ 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。目前在生产环境&#x…

【C++进阶3-二叉搜索树】强,但没貌似还不够?

今天,带来二叉搜索树的讲解。 文中不足错漏之处望请斧正! 是什么 二叉搜索树(Binary Search Tree)又称二叉排序树。 它可以是一棵空树,也可以是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所…

《花雕学AI》不用花钱,也能和ChatGPT聊天!快来看看这五个免费客户端吧

引言 你有没有想过和一个智能的聊天机器人对话?一个可以陪你聊天、讲故事、写代码、模仿名人、生成歌词等等的聊天机器人?如果你有这样的想法,那么你一定要了解ChatGPT。ChatGPT是一个由OpenAI开发的人工智能聊天机器人程序,它使用…

基于Ajax+JSon的表格数据浏览【简单版--没连接数据库】+【连接数据库版】

目录 基于AjaxJSon的表格数据浏览【简单版--没连接数据库】 代码: ajax.js ch10_4.jsp student.java Query.java 运行结果: 点击获取表格后: 基于AjaxJSon的表格数据浏览【简单版--没连接数据库】 代码: ajax.js //声明XM…

【案例实战】SpringBoot3.x自定义封装starter实战

1.starter背景简介及作用 (1)什么是starter starter是SpringBoot中的一个新发明,它有效的下降了项目开发过程的复杂程度,对于简化开发操做有着很是好的效果。 starter的理念:starter会把全部用到的依赖都给包含进来&a…

三极管的几点应用

三极管有三个工作状态:截止、放大、饱和,放大状态很有学问也很复杂,多用于集成芯片,比如运放,现在不讨论。其实,对信号的放大,我们通常用运放处理,三极管更多的是当做一个开关管来使…