Java并发编程(十三)-累加器
参考文献
累加器
AtomicLong :这是最基本的累加器,支持单个long类型的原子性操作.适用于低并发场景或单线程环境.
LongAdder :相比于AtomicLong ,LongAdder 在高并发环境中的性能更好,因为它使用了分段锁来避免多个线程同时竞争一个变量的情况.适用于高并发场景下的计数器或统计器.
DoubleAdder :与LongAdder 类似,但支持double类型的原子性操作.适用于需要累加double类型数据的高并发场景.
LongAccumulator :支持任意函数的原子性操作,可以自定义累加函数.适用于需要累加的场景比较复杂,需要自定义累加函数的情况.
DoubleAccumulator :与LongAccumulator 类似,但支持double类型的原子性操作.
这些累加器在多线程环境下都可以保证线程安全,可以用于实现高性能的计数器、统计器等场景.选择哪种累加器要根据具体的场景和需求来确定.
如果需要进行高并发的累加操作,可以选择LongAdder 或DoubleAdder ;
如果需要自定义累加函数,可以选择L ...
MySQL-Predicates in SQL
参考文献
Predicates in SQL
SQL谓词
谓词只是一个计算结果为TRUE、FALSE 或UNKNOWN的表达式.谓词通常用于WHERE和HAVING子句的搜索条件、FROM子句的连接条件以及需要布尔值的查询的任何其他部分.
谓词有多种类型,其中包括:
Comparison(比较谓词)
LIKE
BETWEEN
IN
EXISTS
IS NULL (/INTEGER/DECIMAL/FLOAT...)
Comparison Predicates 比较谓词
= Equal to
> Greater than
< Less than
>= Greater than or equal to
<= Less than or equal to
<> Not equal to
EXISTS
在EXISTS的子查询里SELECT子句的列表可以有三种写法
通配符: SELECT *
常量: SELECT '任意内容'
列名: SELECT col_name
谓词逻辑中,根据输入值的阶数对谓词进行分类.=或者BETWEEE ...
Java并发编程-Fork/Join
参考文献
JUC线程池: Fork/Join框架详解
线程池ForkJoinPool简介
Fork/Join
Fork/Join框架是Java并发工具包中的一种可以将一个大任务拆分为很多小任务来异步执行的工具,自JDK1.7引入。
ForkJoinPool是ThreadPoolExecutor线程池的一种补充,是对计算密集型场景的加强
Fork/Join组成
任务对象: ForkJoinTask (包括RecursiveTask、RecursiveAction 和 CountedCompleter)
ForkJoinPool只接收ForkJoinTask 任务(在实际使用中,也可以接收 Runnable/Callable 任务,但在真正运行时,也会把这些任务封装成 ForkJoinTask 类型的任务)
RecursiveTask是ForkJoinTask的子类,是一个可以递归执行的 ForkJoinTask
RecursiveAction 是一个无返回值的 RecursiveTask,CountedCompleter 在任务完成执行后会触发执行一个自定义的钩子函数。
...
Java并发编程-FutureTask
参考文献
JUC线程池: FutureTask详解
FutrueTask
FutureTask为Future提供了基础实现,如获取任务执行结果(get)和取消任务(cancel)等.如果任务尚未完成,获取任务执行结果时将会阻塞.一旦执行结束,任务就不能被重启或取消(除非使用runAndReset执行计算).FutureTask 常用来封装 Callable 和 Runnable,也可以作为一个任务提交到线程池中执行.除了作为一个独立的类之外,此类也提供了一些功能性函数供我们创建自定义 task 类使用.FutureTask 的线程安全由CAS来保证.
Callable接口
123456789public interface Callable<V> { /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exception if unable to compute ...
Java并发编程(十四)-CompletableFuture
参考文献
Java8实战
CompletableFuture原理与实践-外卖商家端API的异步化
Future
通常只需要使用将耗时的操作封装在一个Callable对象中,再将它提交给ExecutorService
1234567891011121314151617public class FutureTest { public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); Future<Double> future = executor.submit(new Callable<Double>() { @Override public Double call() throws Exception { return doSomeLongComputation(); ...
Java集合-LinkedList
参考文献
LinkedList-JDK8
属性
123456789101112131415161718// 元素个数transient int size = 0;/** * 链表首节点 * Pointer to first node. * Invariant: (first == null && last == null) || * (first.prev == null && first.item != null) */transient Node<E> first;/** * 链表尾节点 * Pointer to last node. * Invariant: (first == null && last == null) || * (last.next == null && last.item != null) */transient Node<E> last;
节点类
1234567891011private static class Node& ...
Java集合-ArrayList
参考文献
Collection - ArrayList 源码解析
死磕 java集合之ArrayList源码分析
ArrayList-JDK8
属性
123456789101112131415161718192021222324252627282930313233343536373839404142/** * 该常量代表ArrayList默认的初始化容量,实际上这个值在ArrAyList中的使用非常少 * 只出现在ArrayList第一次确认容量的时候——而且还是在默认情况下 * Default initial capacity. */ private static final int DEFAULT_CAPACITY = 10; /** * 该常量值是在ArrayList初始化的时候使用,用来将elementData数组赋值为一个没有元素的空数组。 * 注意:只是在初始化时使用 * 空数组,用于空实例的共享空数组实例(若传入的容量为0时使用). * Shared empty array instance used for emp ...
RocketMQ-基础
参考文献
RocketMQ
Broker(邮递员)
Broker是RocketMQ的核心,负责消息的接收,存储,投递等功能.
NameServer(邮局)
消息队列的协调者,Broker向它注册路由信息,同时Producer和Consumer向其获取路由信息.
Producer(寄件人)
消息的生产者,需要从NameServer获取Broker信息,然后与Broker建立连接,向Broker建立连接,向Broker发送消息.
Consumer(收件人)
消费的消费者,需要从NameServer获取Broker信息,然后与Broker建立连接,从Broker获取消息.
Topic(地区)
用来区分不同类型的消息,发送和接收消息都需要先创建Topic,针对Topic来发送和接收消息.
Message Queue(邮件)
为了提高性能和吞吐量,引入Message Queue,一个Topic可以设置一个或多个Message Queue,这样消息就可以并行往各个Message Queue发送消息,消费者也可以并行的从多个Message Queue读取消息
...
Linux工具-wc
参考文献
wc
1wc -clwm file
-c: 打印字节数
-l: 打印行数
-w: 打印单词总数
-m: 打印字符总数
常用示例
统计当前文件下的文件个数,目录个数
123456789# 统计当前目录下的文件数量(不包含子目录中的文件)ls -l|grep "^-"|wc -l# 统计当前目录下的文件数量(包含子目录中的文件)ls -lR|grep "^-"|wc -l# 统计当前目录下的目录数量(不包含子目录中的)ls -l|grep "^d"|wc -l# 统计当前目录下的目录数量(包含子目录中的)ls -lR|grep "^d"|wc -l
Linux病毒扫描工具-ClamAV
参考文献
ClamAV Documentation
Linux 杀毒软件 ClamAV 初体验
ClamAV
ClamAV是一个开源(GPLv2)反病毒工具包,专为在邮件网关上扫描电子邮件而设计。它提供了许多实用程序,包括一个灵活的、可扩展的多线程守护进程、一个命令行扫描程序和用于自动数据库更新的高级工具。该软件包的核心是以共享库的形式提供的防病毒引擎。
安装
使用软件包安装
默认的从源代码安装将进入 /usr/local ,其中包含:
应用程序:/usr/local/bin
守护进程:/usr/local/sbin
库文件:/usr/local/lib
头文件:/usr/local/include
配置文件:/usr/local/etc/
病毒库:/usr/local/share/clamav/
使用Linux软件包安装,默认安装在 /usr 中,其中包含:
应用程序:/usr/bin
守护进程:/usr/sbin
库文件:/usr/lib
头文件:/usr/include
配置文件:/etc/clamav
病毒库:/var/lib/clamav/
配置C ...