模式设计II

news/2025/3/29 3:13:24/文章来源:https://www.cnblogs.com/xiaoxianglu/p/18790145

两阶段终止:

在一个线程中如何优雅的终止另一个线程,让这个线程自己乖乖释放资源,然后终止;

  • stop()方法,资源不要了,直接灭了线程;

  • System.exit(int)方法,进程我都不要了;

  • 使用interrupt和catch的配合使用:

    1. 没有休眠,interrupted会被置true;

    2. 有休眠状态,自动设置打断标志;

      或者直接使用volatile变量作为标记位,并配合interrupt使用;

同步模式之保护性暂停【Guarded Suspension】:

  • 线程之间的协同工作,单个结果之间的传递;

  • 应用:join和Future的实现;

    synchronized(lock){while(条件){lock.wait();}
    }//
    synchronized(lock){lock.notifyAll();
    }
    

异步模式之生产者和消费者

  • 保护性暂停中的,是线程相互一一对应的;
  • 当不需要生产结果和消费者的线程一一对应的时候;
  • 消息队列,有容量:jdk中各种阻塞的模式;

同步模式之顺序控制:

  • 固定顺序执行【等待标记位,进行判断】;
    • wait-notify,wait-signal【类:ReentrantLock】,可被中断;
    • park-unpark【类:LockSupport】,不可被中断;
  • 交替输出【等待标记int】:
    • wait-notifyAll,wait-signal【ReentrantLock,在Monitor上进行扩展】;
    • Condition-wait-signal【唤醒对应WaitSet】
    • park-unpark【lockSupport】,以线程为操作单位

同步模式之Balking【犹豫】

  • 单例模式之懒汉模式【存在线程安全问题】:

  • 需要双重判断 + 互斥:

    //多线程问题,必须保证instance的可见性,必须是volatile变量;
    if(instance == null) {synchronized(类名.class) {if (instance == null) {instance = new 构造器();}}
    }
    else {return instance;
    }
    
  • synchronized代码块中的代码会局部进行指令重排,当构造方法的执行和对象赋值语句进行重排的时,其他线程有可能会拿到一个没执行构造方法的对象【double-checked locking 问题】;

    • 解决办法:给instance变量加上volatile关键字;
    • 而且当不加volatile关键词时,对instance可能不可见;
  • 单例模式的线程安全性【饿汉,懒汉,枚举,静态内部类】:

    • 是final方法,禁止继承,防止子类重写进行覆盖;

    • 当实现序列化,怎么来防止反序列化生成的对象来破坏单例,添加readResovle()方法

      //规定的
      public Object readResovle(){return instance;
      }//会将instance当作反序列化的结果进行返回;
      
    • 构造器私有,而且不能防止反射创建;

    • 枚举类不能通过反射来破坏单例;

    • 枚举类可以避免反序列化的来破坏单例,而且无需自己添加readResovle()方法;

享元模式【flyweight pattern】:

  • 保护性拷贝避免了数据的共享,但是也带来数据的大量拷贝;

  • 需要重用数量有限的同一类对象;

  • eg:包装类:

    • Byte,short,Long,Integer【上限可调】:缓存范围[-128, 127],采用静态内部类的懒汉模式;
    • Character 缓存范围:[0, 127];
    • Boolean:true和false;

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OP100自动安装背板常见问题

1.运行过程中切手动,回原灯一直闪烁,始终无法执行完成 OP50自动安装座板 OP100自动安装背板 OP280自动安装上盖 这几个工站因为有记忆功能,会记住当前步序以及夹爪/吸盘上有没有物体,如果运行中切换手动,并动了气缸,会导致逻辑错乱,类似升降器的SUB40,遇到这种情况: 1…

20244217 2024-2025-2 《Python程序设计》实验一报告

学号 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2442 姓名: 胡峻豪 学号:20244217 实验教师:王志强 实验日期:2025年3月24日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境。首先在官网下载并安装PyCharm专业版,安装完成后打开软…

软件工程日报15

Android studio 实现连接远程mysql数据库,并将数据展示出来,由于之前没接触过,全靠按照博客上的指导和ai生成的代码,之后在学习一下 以下是效果

《Python程序设计》实验一报告

课程:《Python程序设计》 班级: 2441 姓名: 王晓凤 学号:20244127 实验教师:王志强 实验日期:2025年3月24日 必修/选修: 公选课 一.实验内容 1.熟悉Python开发环境:本次实验使用了PyCharm。首先在官网下载并安装PyCharm社区版,安装完成后打开软件,创建一个新的Pytho…

抽象bug:mybatis-xml配置错误(configuration and configLocation can not specified with together)

mybatis-xml配置错误(configuration and configLocation can not specified with together) 操作 我在使用mybatis-XML映射配置时,没有将mappper的xml文件放在同名同包的路径下,而是使用辅助配置,在配置文件中设置XML路径.然而,在配置文件后,没有成功,一直报错. 错误信息:"…

关于pytorch中直接调用对象

基于之前有C++基础,对于python中的一些函数的用法总会有些疑问。 例如,为什么python可以直接调用对象,而不是调用对象里的函数呢? 以下为包含__call__函数的类的调用 除此之外, 在PyTorch 中,所有继承自 nn.Module 的类都继承了一个特殊的 call() 方法。 # 使用ToTensor创…

事务注解@Transactional

目录 1、属性介绍 2、传播机制准备例子总结3、原理 4、失效场景 一、属性介绍 1、isolation 属性 事务的隔离级别,默认值为 Isolation.DEFAULT。可选的值有:Isolation.DEFAULT:使用底层数据库默认的隔离级别Isolation.READ_UNCOMMITTED:读取未提交数据(会出现脏读,不可重…

Nature | 整合空间转录组与GWAS数据绘制人复杂性状细胞空间图谱

这篇文章是2025年3月发表在《Nature》杂志上的一篇研究,标题为“Spatially resolved mapping of cells associated with human complex traits”。这篇文章通过开发一种名为gsMap的计算方法,整合高分辨率空间转录组(ST)数据与全基因组关联研究(GWAS)统计结果,实现对人类…

【笔记】力扣 102. 二叉树的层序遍历★

102. 二叉树的层序遍历 中等 提示 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1:输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]示例 2: 输入:root = [1] 输出:[[1]]示例 3: 输入:root = [] 输…

【Azure Container App】在消耗性的Container App Environmnet中无法查看当时正在使用多少CPU多少实例数的替代方案

问题描述 在Azure上使用Container App服务,创建服务环境的时候,选择类型为消耗型(Consumption)。但是,却无法查看当前所有应用中,具体使用了多少个 core (CPU), 目前有多少个实例呢? 如上图,上面的信息是 “-” 问题解答 因为在Container App Environment中所使用的Workl…

Redis短信登录场景

1、Redis短信登录场景 1.1、整体流程1.1、发送短信验证码 @Service @Slf4j public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Overridepublic Result sendCode(String phone, HttpSession session) {// 1、校验手机号是否…