前言
Java中有强软弱虚四种引用。
相信JUC和AQS都是大家如雷贯耳、耳熟能详的词儿了。
JUC是大名鼎鼎的java.util.concurrent包的缩写,一看名字就很牛,java提供的并发工具集。而AQS(Abstract Queued Synchronizer)则是JUC包中许多同步工具实现的基础。
我们先来看看JUC包中有哪些东西:
几乎囊括了所有和多线程相关的内容。
本文我们先来总结一下JUC中的同步工具。
在多线程编程之中,通常我们最常需要考虑的是两个问题:1. 竞争问题;2. 协调问题。
竞争问题是指多个线程对同一个资源的竞争,比如:需要修改同一个变量、写同一个文件或者修改数据库的同一条记录……
对于竞争问题,我们通常通过锁机制来保证同一个资源每次只能被一个线程访问。
至于协调问题,一般又分为两种:1. 协调多个线程执行的操作的顺序;2. 多个线程间信息的传递
事实上,问题1往往也是通过问题2来解决的,比如:
一个线程继续向下执行的条件是判断某个变量是否为
true
而另一个线程中,将该变量的值设为
true
实际上,就是一个线程通过共享变量,向另一个线程传递了信息,从而控制了其执行的行为
因此,协调问题,最终又可归结为多线程间信息的传递。
Java中,多线程间的信息传递是靠共享变量实现的。而 JMM(Java Memory Model / java内存模型) 可以说是Java提供的一系列准则和规范,旨在帮助程序猿们准确、高效地解决多线程编程中的协调问题(在JMM中称之为同步问题 Synchronzation)。
我们在很多文章、很多地方听到的许多很难望文生义的名词(诸如:顺序一致性、happens-before原则、内存可见性、MESI等),都来自于JMM。甚至于JMM本身,从其字面意义就很难理解这到底是个什么玩意儿。
Redis 哨兵(Sentinel)的官方文档: Redis Sentinel Documentation
简而言之,哨兵机制是Redis高可用性的保障。
本文主要对该官方文档进行了翻译,同时也结合源码做了部分注解。