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

深入解析Java并发编程与单例模式

目录

一、调度(四)

1.随机调度大环境

二、锁(二)

1.位置

2.无锁阻塞

3.重入锁

4.连续锁

4.1措施

三、线程方法(二)

1.wait

2.notify

3.wait-notify指位后移

3.1可能时再检查

3.1.1join(二)

3.1.1.1可能时再检查死亡

四、单例模式

1.实现

1.1private构造器

1.2一次一个

1.3静态存储

2.样式

2.1饿汉模式

2.2懒汉模式


一、调度(四)

1.随机调度大环境

随机调度大环境 里面有 锁竞争阻塞,里面又有 代码块的竞锁能力


二、锁(二)

1.位置

锁只在竞争中 跳跃存在


2.无锁阻塞

竞争无锁处 被锁阻塞


3.重入锁

线程重入锁处运行态其它代码块被锁阻塞 无竞争高效地获取锁


4.连续锁

线程连续竞同锁 会因上把锁出时 还处运行态其他同锁竞争线程的 阻塞刚唤醒态 容易连续调度 去竞争到同锁

4.1措施

可在上把锁 用wait后移 消除连续调度竞争避免造成 线程饿死


三、线程方法(二)

1.wait

锁的wait方法 对身竞争代码块 停位地 封印其竞锁能力,便也失去了锁,处于无法参与竞争的 永阻塞状态

  • wait(时间)设置最长等待时间自动唤醒

2.notify

锁的notify方法 对异竞争代码块 续位地 恢复其竞锁能力,在瞬时间内 处回可参与竞争的 现阻塞状态

  • notify 随机唤醒一个此锁wait线程,notifyAll 唤醒所有此锁wait线程

3.wait-notify指位后移

锁的wait方法 将身线程wait后部分 阻塞往后放到 异线程锁noity方法的后面,应用案例:

3.1可能时再检查

循环连续的wait阻塞 等着只为每次可能情况时 再notify对接 来唤醒检查一下提高了检查的情况针对性

3.1.1join(二)

join使当前线程 执行卡在该方法 直到该线程实例的系统线程死亡 才执行完退出来,将当前线程后部分 阻塞往后放到 目标系统线程死亡的后面

3.1.1.1可能时再检查死亡

系统线程销毁死亡后,对应的线程实例自动调用notifyAll,所以就可以针对线程实例notify时 才对线程进行死亡检查

public final synchronized void join(long millis) throws InterruptedException {while (this.isAlive()) {wait(millis);}
}

四、单例模式

1.实现

1.1private构造器

private向外 封闭构造器 无法外部创建实例


1.2一次一个

内部只创建一次一个


1.3静态存储

放静态中 外部才可 对类的仅静态取出


2.样式

2.1饿汉模式

必创建地 类加载时就创建实例:

class SingletonHungry {private static SingletonHungry instance = new SingletonHungry();//static静态存储,只有类加载时的创建一次一个private SingletonHungry() {}//private封闭构造器public static SingletonHungry getInstance() {//封装好获取return instance;}
}

2.2懒汉模式

需要时 才调用接口去创建实例:

class SingletonLazy {private static SingletonLazy instance = null;//static静态存储private SingletonLazy() {}//private封闭构造器public static SingletonLazy getInstance() {if (instance == null) { //优化时 线程不加锁能过(只读)情况 就拎开 少加点锁 分开处理掉synchronized (SingletonLazy.class) {//写的这块范围内 线程安全问题保障:if (instance == null) {//->连续读取instance的null时,两次没有前后影响到 都读为null 都去创建实例instance = new SingletonLazy();}return instance;}}return instance;}
}

http://www.dtcms.com/a/354425.html

相关文章:

  • 详解Log4j组件:工业级Java日志框架
  • Redis实战-点赞的解决方案
  • vue布局
  • LightGBM 在金融逾期天数预测任务中的经验总结
  • 2025年渗透测试面试题总结-36(题目+回答)
  • 2025年渗透测试面试题总结-37(题目+回答)
  • vue3 数据库 内的 字符 显示 换行符
  • LeetCode-238除自身以外数组的乘积
  • 基于单片机步进电机控制电机正反转加减速系统Proteus仿真(含全部资料)
  • codeforces(1045)(div2) E. Power Boxes
  • 2024年09月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • Kubernetes 的20 个核心命令分类详解
  • 深度学习11 Deep Reinforcement Learning
  • 基于视觉的网页浏览Langraph Agent
  • 【RAG知识库实践】向量数据库VectorDB
  • Linux应用软件编程---网络编程(TCP并发服务器构建:[ 多进程、多线程、select ])
  • Spring Start Here 读书笔记:第15 章 Testing your Spring app
  • 【PyTorch】基于YOLO的多目标检测项目(二)
  • vue2 watch 的使用
  • Xshell 自动化脚本大赛技术文章大纲
  • TypeScript:重载函数
  • 《Linux 网络编程四:TCP 并发服务器:构建模式、原理及关键技术(select )》
  • oceanbase-部署
  • yolo ultralytics之yolov8.yaml文件简介
  • 《信息检索与论文写作》实验报告三 中文期刊文献检索
  • Linux 云服务器内存不足如何优化
  • LinuxC系统多线程程序设计
  • C语言:数据在内存中的存储
  • nginx referer-policy 和 referer
  • redis集群分片策略