JUC-Collection-PriorityBlockingQueue
参考文献
Java多线程进阶(三四)—— J.U.C之collections框架:PriorityBlockingQueue
PriorityBlockingQueue
PriorityBlockingQueue,是在JDK1.5时,随着J.U.C包引入的一种阻塞队列,它实现了BlockingQueue接口,底层基于堆实现.
PriorityBlockingQueue是一种无界阻塞队列,它具有以下特点:
元素按照权重大小的顺序出队:与其他阻塞队列不同,PriorityBlockingQueue是一种优先级队列。元素不是按照FIFO(先进先出)的方式出队,而是根据元素的权重来确定优先级,权重较小的元素先出队。
无需指定最大容量:与ArrayBlockingQueue不同,创建PriorityBlockingQueue时无需指定最大容量,它是真正的无界队列。它只受系统内存大小的限制,没有预设的最大容量。
元素必须可比较:由于PriorityBlockingQueue是基于元素权重排序的,因此队列中的元素必须可比较。这意味着元素必须实现Comparable接口,以便进行排序。
插入元 ...
JUC Collection-LinkedBlockingQueue
参考文献
Java多线程进阶(三三)—— J.U.C之collections框架:LinkedBlockingQueue
LinkedBlockingQueue
LinkedBlockingQueue是在JDK1.5时,随着J.U.C包引入的一种阻塞队列,它实现了BlockingQueue接口,底层基于单链表实现.
LinkedBlockingQueue除了底层数据结构(单链表)与ArrayBlockingQueue不同外,另外一个特点就是:它维护了两把锁——takeLock和putLock。
takeLock用于控制出队的并发,putLock用于入队的并发。这也就意味着,同一时刻,只能只有一个线程能执行入队/出队操作,其余入队/出队线程会被阻塞;但是,入队和出队之间可以并发执行,即同一时刻,可以同时有一个线程进行入队,另一个线程进行出队,这样就可以提升吞吐量。
属性
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 ...
JUC Collection-ArrayBlockingQueue
参考文献
JUC集合: BlockingQueue详解
ArrayBlockingQueue(基于数组的阻塞队列)
队列的容量一旦在构造时指定,后续不能改变;
插入元素时,在队尾进行;删除元素时,在队首进行;
队列满时,调用特定方法插入元素会阻塞线程;队列空时,删除元素也会阻塞线程;
支持公平/非公平策略,默认为非公平策略。
公平策略,是指当线程从阻塞到唤醒后,以最初请求的顺序(FIFO)来添加或删除元素;
非公平策略指线程被唤醒后,谁先抢占到锁,谁就能往队列中添加/删除顺序,是随机的。
属性
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { /** * 内部数组 ...
JUC Collection-BlockingQueue
参考文献
JUC集合: BlockingQueue详解
BlockingQueue
BlockingQueue是Java中的一个接口,用于在多线程环境下实现线程间的安全数据交换.它通常用于生产者-消费者场景,其中一个线程负责向队列中放入对象,另一个线程负责从队列中取出对象.
在这个场景中,生产线程会不断地创建新对象并将其插入到队列中,直到队列达到其容量上限.一旦队列达到临界点,生产线程在尝试插入新对象时会被阻塞.它会一直等待,直到消费线程从队列中取走一个对象.消费线程则会一直从队列中取出对象.如果消费线程尝试从空队列中提取对象,它也会被阻塞,直到生产线程将一个对象放入队列中.
BlockingQueue的实现类有多种,包括ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等.不同的实现类有着不同的特性和适用场景,但它们都遵循上述的基本原理.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 ...
Java并发编程(十六)-JUC Collections
参考文献
JUC Collections 集合框架
Queue
Blocking Queue阻塞队列
java.util.concurrent.ArrayBlockingQueue:最基础且开发中最常用的阻塞队列,底层采用数组实现的有界队列,初始化需要指定队列的容量.
ArrayBlockingQueue 是如何保证线程安全的呢?它内部是使用了一个重入锁ReentrantLock,并搭配 notEmpty、notFull 两个条件变量Condition来控制并发访问.从队列读取数据时,如果队列为空,那么会阻塞等待,直到队列有数据了才会被唤醒.如果队列已经满了,也同样会进入阻塞状态,直到队列有空闲才会被唤醒.
java.util.concurrent.LinkedBlockingQueue:内部采用的数据结构是链表,队列的长度可以是有界或者无界的.
初始化不需要指定队列长度,默认是Integer.MAX_VALUE.LinkedBlockingQueue 内部使用了takeLock、putLock两个重入锁ReentrantLock,以及notEmpty、notFull两 ...
读书笔记-Effective Java(原书第3版)
第二章 创建和销毁对象
第1条: 用静态工厂方法代替构造器
优势
静态工厂方法与构造器不同的第一大优势在于,它们有名称.
静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新对象.
静态工厂方法与构造器不同的第三大优势在于,它们可以返回原返回类型的任何子类型的对象.
静态工厂方法的第四大优势在于,所返回的对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值.
静态工厂方法的第五大优势在于,方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不存在.
缺点
静态工厂方法的主要缺点在于,类如果不含公有的或者受保护的构造器,就不能被子类化.
静态工厂方法的第二个缺点在于,程序员很难发现它们.
一些惯用的名称
from: 类型转换方法,它只有单个参数,返回该类型的一个相对应的实例
1Date d = Date.from(instant);
of: 聚合方法,带有多个参数,返回该类型的一个实例,把它们合并起来.
1Set<Rank> faceCards = EnumSet.of(JACK,QUEEN,KING);
...
Java Array
参考文献
Arrays
数组长度
所使用的排序算法
length < 47
插入排序
47 <= length < 286
快速排序
length >= 28
归并排序
length >= 286
快速排序
设计模式-结构型-代理模式(Proxy)
参考文献
https://refactoringguru.cn/design-patterns/proxy
https://www.oodesign.com/proxy-pattern
代理模式
让你能够提供对象的替代品或其占位符. 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理.
组件
抽象主题(Subject): 定义了真实主题和代理主题之间的共同接口,客户端通过该接口访问真实主题.
真实主题(Real Subject): 定义了真实对象的具体业务逻辑.代理对象通过调用真实主题来完成实际的操作.
代理主题(Proxy Subject): 实现了抽象主题接口,并在其内部维护了一个引用,指向真实主题对象.代理主题负责控制对真实主题对象的访问,并且可以在真实主题的基础上增加额外的功能,如权限验证、缓存等.
客户端(Client): 通过抽象主题接口与代理主题进行交互.客户端不需要知道真实主题的存在,只需要通过代理主题完成相应的操作.
实现方式
定义抽象主题接口: 首先,需要定义一个抽象主题接口,该接口定义了真实主题和代理主题之间的共同方法.
123 ...
设计模式-结构型-外观模式(Facade)
参考文献
https://refactoringguru.cn/design-patterns/facade
https://java-design-patterns.com/patterns/facade/
外观模式
能为程序库、 框架或其他复杂类提供一个简单的接口
组件
外观(Facade):外观对象是客户端与子系统之间的接口,它封装了子系统的复杂性,提供了一个简化的接口供客户端使用.
子系统(Subsystems):子系统是一组相关的类或接口,它们实现了系统的各个功能.子系统可以包含多个类和层次结构,但是通过外观对象,客户端只需要与外观对象进行交互,而不需要直接与子系统的各个类打交道.
客户端(Client):客户端是使用外观模式的对象.它通过外观对象来访问子系统的功能,而不需要了解子系统的具体实现.
实现方式
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748// 子系统类:库存管理系统class InventorySystem { ...
设计模式-结构型-装饰器模式(Decorator)
参考文献
https://www.oodesign.com/decorator-pattern
https://refactoringguru.cn/design-patterns/decorator
装饰器模式
此模式的目的是向对象动态添加额外的职责.
组件
抽象组件(Component): 定义了被装饰对象的接口,可以是抽象类或接口.它通常声明了核心的操作方法.
具体组件(ConcreteComponent): 实现了抽象组件接口,是被装饰的原始对象.具体组件是装饰器模式的核心.
抽象装饰器(Decorator): 也是抽象组件的实现类,它持有一个抽象组件对象作为成员变量,并通过构造函数或setter方法进行注入.
具体装饰器(ConcreteDecorator): 继承自抽象装饰器,实现了抽象组件的接口,并在其中添加额外的功能.具体装饰器可以对抽象组件进行装饰,即包装一个具体组件对象,并在调用核心功能方法前后增加额外的行为.
实现方式
定义抽象组件(Component)接口,声明需要被装饰的核心功能方法.
123interface Report { ...