Java
未读
线程池----上
摘要:
线程池是一种池化技术,旨在避免资源重复创建和销毁的性能开销。线程池通过管理和复用线程,实现资源的高效利用。线程池的主要好处包括降低资源消耗、提高响应速度以及提升线程的可管理性。
在Java中,线程池主要通过构建ThreadPoolExecutor来创建。其核心构造参数包括核心线程数、最大线程数、存活时间、时间单位、任务队列、线程工厂以及拒绝策略。
线程池的运行原理如下:
1. 线程池刚创建时只有阻塞队列,没有线程。
2. 当提交任务时,首先判断当前线程数是否小于核心线程数,若是,则创建线程执行任务;否则,尝试将任务放入阻塞队列。
3. 若队列已满且线程数小于最大线程数,会创建非核心线程执行任务;否则,执行拒绝策略。
4. 线程执行完任务后,不会退出,而是从队列中获取任务继续执行。
5. 如果任务提交时队列中有任务,新创建的线程会优先处理新提交的任务。
6. 线程池的execute方法根据线程数量及任务情况,决定是添加核心线程、非核心线程还是执行拒绝策略。
至于keepAliveTime和unit参数的作用,它们用于设定非核心线程的存活时间和时间单位,当线程数超过核心线程数时,这些参数会发挥作用,确保非核心线程在空闲一段时间后能够终止,从而节省资源。拒绝策略中的不同实现如AbortPolicy、CallerRunsPolicy等,可根据实际需求选择。
设计模式
未读
快速回顾常见十种设计模式应用场景
摘要:
本文主要介绍了工厂模式、单例模式、观察者模式、策略模式、模板方法模式、代理模式、装饰器模式、建造者模式、迭代器模式和责任链模式等常见的软件设计模式的应用场景和使用方法。这些模式在软件设计中广泛应用于解决不同的问题,如确保单一实例、通知对象状态变化、根据条件选择算法、继承多个类并实现部分方法、控制客户端与实际对象交互、运行时扩展对象功能、构建复杂对象、遍历集合元素以及处理请求等。通过对这些模式的应用,可以有效提高软件的灵活性和可维护性。
计网与系统
未读
计算机操作系统基础知识点总结
操作系统是管理计算机系统的硬件和软件资源的系统软件,其目标包括方便性、有效性、可扩充性和开放性。操作系统的基本功能包括统一管理计算机资源、对硬件资源的抽象、提供用户与计算机之间的接口。操作系统的特征包括并发、共享、虚拟和异步。中断处理是操作系统响应外部事件和硬件请求的重要机制,包括暂停当前进程、进入中断处理程序和恢复并继续执行。
进程是系统进行资源分配和调度的基本单位,其管理涉及进程控制块、进程与线程的区别和联系、五种状态模型(就绪、执行、阻塞、创建、终止)以及进程同步(如生产者-消费者问题和哲学家进餐问题)。进程同步的目的是协调多个进程间对共享资源的访问顺序,确保数据的一致性和系统的稳定性。Linux的进程管理包括进程类型(前台、后台、守护进程)和进程标记(进程ID和状态标记)。
作业管理涉及进程调度,即决定哪个就绪进程可以获得CPU使用权。调度方式包括非抢占式和抢占式,机制包括就绪队列、委派机制和上下文切换。进程调度算法包括先来先服务、短进程优先、高优先权优先和时间片轮转。死锁是进程间因竞争资源或通信造成的一种阻塞现象,其处理策略包括预防、银行家算法、检测与解除。
存储管理涉及内存分配与回收、段页式存储管理和虚拟内存。虚拟内存允许程序使用比物理内存更大的地址空间,通过页面调度、映射机制和交换空间等机制,实现内存的有效利用。Linux的存储管理采用Buddy算法和交换空间,以优化内存管理和提高系统性能。
综上所述,操作系统通过管理计算机资源、提供用户接口、处理中断和进行进程管理,确保系统的高效运行和资源的有效利用。
设计模式
未读
软件设计模式——七大设计原则
摘要:
设计模式是解决软件设计中反复出现的问题及其解决方案的一套经验总结。其目的是提高代码的可重用性、可读性和可靠性。包含多种开发原则,其中开闭原则强调对扩展开放、对修改关闭;依赖倒置原则主张面向接口编程;单一职责原则要求一个类只有一个引起变化的原因;接口隔离原则强调接口精简、功能解耦;迪米特法则减少类间耦合;里氏替换原则保护继承体系的稳定性;合成复用原则提倡使用组合或聚合实现代码复用,减少继承。这些原则的核心目的是降低对象间的耦合,增加程序的可复用性、可扩展性和可维护性。在程序设计中,应遵循功能最小化、合理使用继承、运用接口、低耦合高内聚等原则。
设计模式
未读
常见的设计模式--下
好的,以下是您所请求的摘要总结:
一、观察者模式
观察者模式定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,会自动通知所有观察者对象,使它们能够自动更新自己。在TypeScript中,可以使用接口和类来实现观察者模式。应用场景包括当被观察对象的状态发生改变时,需要更新相关依赖对象的状态。
二、发布订阅模式
发布订阅模式是一种消息范式,消息的发送者(发布者)不会直接将消息发送给特定的接收者(订阅者)。而是将发布的消息分为不同的类别,然后分别发送给不同的订阅者。订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息。在TypeScript中,可以通过类来实现发布订阅模式。应用场景包括事件总线,实现不同组件或模块间的通信。
三、策略模式
策略模式定义了一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,使程序结构更灵活、可维护、可扩展。应用场景包括一个系统需要动态地在几种算法中选择一种时,可以将每个算法封装到策略类中。
四、职责链模式
职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。请求在一个链上传递,直到链上的某一个对象处理此请求。应用场景包括在处理请求的对象集合需要被动态指定的情况下,或者在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
五、模板方法模式
模板方法模式由抽象父类和具体的实现子类组成。抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有方法的执行顺序。子类通过继承这个抽象类,可以选择重写父类的方法。应用场景包括算法的整体步骤很固定,但其中个别部分易变时,可以将容易变的部分抽象出来,供子类实现。
这些设计模式在软件工程中都非常常用,理解并熟练使用这些模式可以帮助我们更好地设计和开发软件。
设计模式
未读
常见的设计模式--上
总结:
一、建造者模式:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。常用于需要构建多个部分组成的复杂对象,如汽车。
二、工厂模式:
1. 简单工厂模式:根据给定的参数创建对象,而无需知道具体的产品类。
2. 工厂方法模式:工厂父类定义创建产品的接口,工厂子类负责生成具体的产品对象。适用于一个类不知道它需要哪些对象的情况。
3. 抽象工厂模式:提供创建一系列相关或依赖对象的接口,但不必指定具体的类。适用于一个系统有多个产品族的情况。
三、单例模式:确保一个类只有一个实例,并提供一个全局访问点。常用于需要频繁实例化但又只需要一个实例的对象,如全局缓存。
四、适配器模式:解决两个软件实体间的接口不兼容问题。适用于使用第三方组件但其接口不符合系统要求的情况。
以上四种设计模式在实际生活和软件开发中都有广泛的应用,选择合适的模式可以大大提高代码的可维护性和重用性。
Java
未读
Java并发-补充
这段内容涵盖了多线程编程中的几种模式和设计,包括两阶段终止模式、Balking模式、保护性暂停模式、生产者/消费者模式、哲学家就餐问题、double-checked locking问题、共享模型之不可变、final原理、享元设计模式以及包装类的使用。
摘要总结:
1. **两阶段终止模式**:在Java中,可以使用`Thread.interrupt()`来请求线程中断,然后线程可以检查`Thread.currentThread().isInterrupted()`来决定是否停止。这种“优雅”的停止方式给了线程一个机会来清理资源。
2. **Balking模式**:一个线程在发现另一个线程已经完成了某项任务时,就不会再次执行。
3. **保护性暂停模式**:一个线程等待另一个线程的结果,这种模式常用于同步操作。
4. **生产者/消费者模式**:一个或多个生产者线程生成数据,一个或多个消费者线程处理数据。
5. **哲学家就餐问题**:一个经典的并发问题,通过使用ReentrantLock和tryLock()方法来解决。
6. **double-checked locking问题**:在单例模式中的初始化问题,确保在多线程环境下正确地创建单例。
7. **共享模型之不可变**:如果一个对象的状态在创建后不可更改,那么它就是线程安全的。
8. **final原理**:`final`关键字确保变量、方法或类在初始化后不能被更改。
9. **享元设计模式**:当需要重用数量有限的同一类对象时,使用享元模式。
10. **包装类**:Java的包装类,如Long、Integer等,提供了缓存机制来重用对象,以减少内存消耗。
这些模式和设计在解决多线程编程中的复杂问题时非常有用,它们提供了处理并发、同步、资源管理和性能优化的方法。
Java
未读
三、Java并发
摘要:
线程池是Java中用于管理线程的一种机制,可以有效地控制线程的数量,避免无节制地创建线程,导致系统崩溃。线程池的主要参数包括核心线程数、等待队列、最大线程数、拒绝策略和空闲线程存活时间。当向线程池提交任务时,它按照一定规则处理任务,包括新建线程、将任务放入等待队列、拒绝任务等。线程池的优点包括线程复用、减少创建和销毁线程的开销,以及更好地控制线程的数量和执行流程。Java的线程池主要通过ThreadPoolExecutor类实现,其子类ScheduledThreadPoolExecutor支持定时任务的执行。线程池的使用需要合理配置参数,以充分利用系统资源并避免潜在问题。
Java还提供了一些并发工具类,如Semaphore、CountDownLatch和CyclicBarrier,以及本地存储解决方案ThreadLocal,这些都可以帮助实现线程安全。此外,通过原子类、volatile关键字和锁机制,也能保证多线程访问共享资源的线程安全。
Java的线程池和并发工具类在并发编程中非常重要,合理使用它们可以提高程序的性能和可维护性。
Java
未读
二、Java集合类
摘要:
Java的集合框架包括List、Map、Set、Concurrent等,提供了丰富的数据结构供开发者选择。List中的ArrayList和LinkedList,Map中的HashMap、TreeMap和HashTable,Set中的HashSet和LinkedHashSet,以及Concurrent包中的ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue等,都是常用的集合类。这些集合类在底层实现上有所不同,如ArrayList基于数组,HashMap基于数组+链表+红黑树,而LinkedList则基于双向链表。同时,这些集合类在并发处理、线程安全、内存效率等方面存在差异,需要根据具体需求选择合适的集合类。例如,ArrayList和LinkedList在数据插入、删除的位置不同时性能差异明显,而HashMap和ConcurrentHashMap在并发操作下有不同的表现。
此外,Java的集合类还提供了丰富的操作,如添加、删除、查找、迭代等,且支持多线程环境下的安全操作。同时,集合类还提供了一些高级特性,如失败机制和线程安全,以及如何有效地处理并发访问。例如,ConcurrentHashMap采用CAS和synchronized保证并发安全,CopyOnWriteArrayList在写操作时复制新数组,而非阻塞队列在队列为空时不会阻塞等待。
综上所述,Java的集合框架提供了多种数据结构,适用于不同场景下的数据存储和处理需求。

