Java并发编程(九)-并发工具类简介
参考文献
Java并发编程的艺术
CountDownLatch
CyclicBarrier
Java并发编程入门(十五)CyclicBarrier应用场景
并发工具类
提供了比synchronized更加高级的各种同步结构,包括CountDownLatch、CyclicBarrier、Semaphore等,可以实现更加丰富的多线程操作,比如利用Semaphore作为资源控制器,限制同时进行工作的线程数量.
各种线程安全的容器,比如最常见的ConcurrentHashMap、有序的ConcunrrentSkipListMap,或者通过类似快照机制,实现线程安全的动态数组CopyOnWriteArrayList等.
各种并发队列实现,如各种BlockedQueue实现,比较典型的ArrayBlockingQueue、SynchorousQueue或针对特定场景的PriorityBlockingQueue等.
强大的Executor框架,可以创建各种不同类型的线程池,调度任务运行等,绝大部分情况下,不再需要自己从头实现线程池和任务调度器.
CountDownLatch(等待多个线程 ...
MQ-面试题
参考文献
消息队列使用场景
异步处理
优点:
可以更快地返回结果;
减少等待,自然实现了步骤之间的并发,提升系统总体的性能.
流程控制
优点:
能根据下游的处理能力自动调节流量,达到“削峰填谷”的作用
缺点:
增加了系统调用链环节,导致总体的响应时延变长.
上下游系统都要将同步调用改为异步消息,增加了系统的复杂度.
服务解耦
作为发布 / 订阅系统实现一个微服务级系统间的观察者模式;
连接流计算任务和数据;
用于将消息广播给大量接收者.
消息中间件的选择
RabbitMQ
优点
RabbitMQ 的架构简单,易于上手,开发人员可以快速使用.
RabbitMQ 提供了丰富的消息模式,例如发布-订阅模式、工作队列模式、RPC 模式等.
RabbitMQ 支持各种消息传递协议,包括 AMQP、MQTT、STOMP 等.
RabbitMQ 的可靠性较高,支持持久化消息,可以确保消息不会丢失.
缺点
RabbitMQ 的性能较低,不适合处理高吞吐量的消息.
RabbitMQ 的可扩展性有限,节点的数量和规模受限于 Erlang VM 的性能.
Rabbit ...
知识点-Latency Numbers Every Programmer Should Know
参考文献
Latency Numbers Every Programmer Should Know
Latency Numbers Every Programmer Should Know
Latency numbers every programmer should know
Latency numbers every programmer should know
12345678910111213141516171819202122232425262728293031----------------------------------L1 cache reference 0.5 nsBranch mispredict 5 nsL2 cache reference 7 ns 14x L1 cacheMutex lock/unlock ...
知识点-Powers of two table
参考文献
12345678910Power Exact Value Approx Value Bytes---------------------------------------------------------------7 1288 25610 1024 1 thousand 1 KB16 65,536 64 KB20 1,048,576 1 million 1 MB30 1,073,741,824 1 billion 1 GB32 4,294,967,296 ...
Linux工具-scp
参考文献
scp
1scp [参数] [原路径] [目标路径]
命令参数
-1 强制scp命令使用协议ssh1
-2 强制scp命令使用协议ssh2
-4 强制scp命令只使用IPv4寻址
-6 强制scp命令只使用IPv6寻址
-B 使用批处理模式(传输过程中不询问传输口令或短语)
-C 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
-p 留原文件的修改时间,访问时间和访问权限。
-q 不显示传输进度条。
-r 递归复制整个目录。
-v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
-c cipher 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
-F ssh_config 指定一个替代的ssh配置文件,此参数直接传递给ssh。
-i identity_file 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
-l limit 限定用户所能使用的带宽,以Kbit/s为单位。
-o ssh_option 如果习惯于使用ssh_config(5)中的参数传递方式,
-P port 注 ...
Linux工具-tcpdump
参考文献
https://wizardzines.com/zines/tcpdump/
https://www.tcpdump.org/manpages/tcpdump.1.html
https://www.tcpdump.org/manpages/pcap-filter.7.html
tcpdump
tcpdump抓包使用的是libpacp这种机制.它的大致原理是:在收发包时,如果该包符合tcpdump设置的规则(BPF filter),那么该网络包就会被拷贝一份到tcpdump的内核缓冲区,然后以PACKET_MMAP的方式将这部分内存映射到tcpdump用户空间,解析后就会把这些内容给输出了
123456789101112root@root:/home/root# tcpdump -htcpdump version 4.9.3libpcap version 1.9.1 (with TPACKET_V3)OpenSSL 1.1.1f 31 Mar 2020Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ ...
Linux工具-wget
参考文献
wget
1wget [参数] [URL地址]
命令参数
启动参数:
-V, –version 显示wget的版本后退出
-h, –help 打印语法帮助
-b, –background 启动后转入后台执行
-e, –execute=COMMAND 执行’.wgetrc’格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc
记录和输入文件参数
-o, –output-file=FILE 把记录写到FILE文件中
-a, –append-output=FILE 把记录追加到FILE文件中
-d, –debug 打印调试输出
-q, –quiet 安静模式(没有输出)
-v, –verbose 冗长模式(这是缺省设置)
-nv, –non-verbose 关掉冗长模式,但不是安静模式
-i, –input-file=FILE 下载在FILE文件中出现的URLs
-F, –force-html 把输入文件当作HTML格式文件对待
-B, –base=URL 将URL作为在-F -i参数指定的文件中出现的相对链接的前缀
–sslcertfile=FIL ...
JVM(八)-异常处理
参考文献
极客时间-JVM是如何处理异常的?
异常处理
异常处理的两大组成要素是抛出异常和捕获异常.这两大要素共同实现程序控制流的非正常转移.
抛出异常可分为显式和隐式两种.显式抛异常的主体是应用程序,它指的是在程序中使用throw关键字,手动将异常实例抛出.
隐式抛异常的主体则是 Java 虚拟机,它指的是 Java 虚拟机在执行过程中,碰到无法继续执行的异常状态,自动抛出异常.举例来说,Java 虚拟机在执行读取数组操作时,发现输入的索引值是负数,故而抛出数组索引越界异常(ArrayIndexOutOfBoundsException).
捕获异常则涉及了如下三种代码块:
try 代码块:用来标记需要进行异常监控的代码.
catch 代码块:跟在 try 代码块之后,用来捕获在 try 代码块中触发的某种指定类型的异常.除了声明所捕获异常的类型之外,catch 代码块还定义了针对该异常类型的异常处理器.在 Java 中,try 代码块后面可以跟着多个 catch 代码块,来捕获不同类型的异常.Java 虚拟机会从上至下匹配异常处理器.因此,前面的 catch 代码块所捕获的异 ...
JVM(七)-静态绑定和动态绑定
参考文献
极客时间-JVM是如何执行方法调用的?(上)
静态绑定和动态绑定
静态绑定: 所有依赖静态类型来定位方法执行版本的分派方式.如: 重载方法.
静态绑定(也称为早期绑定)是指在编译时进行的方法绑定.在静态绑定中,方法调用的具体实现在编译时已经确定,因此它是基于引用类型而不是基于运行时对象类型的.这意味着,如果调用的方法是在父类中定义的,则不管实际运行时类型是什么,该方法都将被调用.
动态绑定: 根据运行的时机类型来定位方法执行版本的分派方式.如: 重写方法.
动态绑定(也称为晚期绑定或运行时绑定)是指在运行时进行的方法绑定.在动态绑定中,方法调用的具体实现是在运行时根据实际对象类型确定的,因此它是基于运行时对象类型的.
Java 虚拟机识别方法的关键在于类名,方法名以及方法描述符(method descriptor).
方法描述符: 它是由方法的参数类型以及返回类型所构成.在同一个类中,如果同时出现多个名字相同且描述符也相同的方法,那么 Java 虚拟机会在类的验证阶段报错.
Java 虚拟机中关于方法重写的判定同样基于方法描述符.也就是说,如果 ...
Linux工具-top
参考文献
top linux下的任务管理器
Linux 中 CPU 利用率是如何算出来的?
top命令说明
1234567891011top - 16:30:42 up 308 days, 19:08, 1 user, load average: 0.00, 0.02, 0.00Tasks: 120 total, 1 running, 119 sleeping, 0 stopped, 0 zombie%Cpu(s): 0.5 us, 1.0 sy, 0.0 ni, 98.2 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 stMiB Mem : 3591.0 total, 158.4 free, 2741.9 used, 690.7 buff/cacheMiB Swap: 0.0 total, 0.0 free, 0.0 used. 565.8 avail Mem PID USER PR NI VIRT RES SHR S %CPU %ME ...