首页
精选文章内存屏障查看全文程序执行的顺序和代码的顺序不一定是一致的,因为程序编译期间的优化、cache访问的优化以及多核等因素都会导致CPU指令乱序执行,这些乱序可能会导致程序的运行结果不符合预期。内存屏障会设置同步点,即使在多核的情况下也可以保障屏障前后的内存访问的一致性。 编译屏障 编译屏障告诉编译器不要对当前代码进行过度的优化,保证生成的汇编代码的指令顺序尽量和编程语言的代码顺序保持一致。编译屏障对CPU执行时产生的重排序没有任何作用。 写内存屏障 写内存屏障可以起到两个作用: 指令重排的限制,写内存屏障之前的写操作将在屏障后的写操作之前发生。 写内存屏障之后的写入指令之前,会清空当前CPU存储缓冲中的所有写操作,将这些数据全部写入到主存中。这样的话系统中的其它的CPU,其他的线程就可以看到写内存屏障之后的写入数据之前先看到写内存屏障之前的写入数据。 读内存屏障 写内存屏障可以起到两个作用: 指令重排的限制,读内存屏障之前的读操作将在屏障后的读操作之前发生。 在执行读内存屏障之后的读取指令之前,一定要保证处理完当前CPU的无效队列。这样的话,当前CPU的缓存状态将完全遵照MESI协议,可以保证缓存数据一致性。 读写内存屏障 读写内存屏障可以起到两个作用: 通用内存屏障也会对处理器指令重排做出一些限制,也就是在通用内存屏障之前的写入和读取指令一定不会被重排序到通用内存屏障之后的写入和读取指令之后。 其次,在执行通用内存屏障之后的任何写入和读取取指令之前,一定要保证清空当前CPU存储缓冲中的所有写操作,并且还要处理完当前CPU的无效队列。AQS查看全文在jdk1.5之前,java提供的并发机制只有 synchronized,但是synchronized提供的功能较为单一,而且效率较为低下。jdk1.5的并发包(JUC)提供了多种锁以及同步机制,例如CountDownLatch、FutureTask、ReentrantLock、RenntrantReadWriteLock、Semaphore等,其实现的核心类就是AbstractQueuedSynchronizer,一般简称为AQS,该类为不同场景提供了锁实现以及同步机制的基本框架,为同步状态的原子性管理,线程的阻塞以及解除阻塞,等待同步的排队管理提供了通用的机制。 AQS本质是一个同步器,提供获取锁以及释放锁的能力,多线程场景下加锁解锁的获取步骤如下: 需要加锁的线程发起加锁请求,如果此时锁未被占用,则把锁标志为被该线程占用 如果加锁的时候发现锁已经被其他线程占用,则当前线程需要等待,等待的方式分为两种,一种是通过高频自旋检查锁是否释放,一旦锁释放则重新发起加锁请求,另一种是进入阻塞队列等待被唤醒之后再进行抢锁操作。 占用锁的线程完成业务操作之后,释放锁的时候可以将在阻塞队列中的线程唤醒,以便这些线程可以重新发起加锁的请求。 要满足加锁和解锁的功能需要有下列几个组件: 操作锁定状态的原子能力 存储等待线程的阻塞队列 阻塞和唤醒线程的能力 同步状态 AQS内部标识同步状态的字段为state。所有通过AQS实现功能的同步类都是通过修改state的状态来操作同步状态。 AQS定义两种资源共享方式:Exclusive(独占,只有一个线程能执行,如ReentrantLock)和Share(共享,多个线程可同时执行,如Semaphore/CountDownLatch…RocketMQ查看全文RocketMQ最早是阿里巴巴研发的类Kafka的消息队列,前身是MetaQ,后来开源,目前已经是apache旗下的顶级开源项目,RocketMQ采用Java语言进行开发,具有高性能、高可靠、高实时、分布式特点。RocketMQ由Producer,Consumer,Broker,NameServer等四个组件构成。 Broker 存储 Broker的存储可以分为数据文件的存储和索引文件的存储。 数据文件就是消息存储文件,各个Topic的消息根据到达 Broker 的顺序写入各自的 CommitLog 文件,CommitLog文件默认为1G,文件的命名信息中包含了该存储在消息文件中的第一个全局偏移量,从而根据offset可以快速定位到消息所在的物理文件。 RocketMQ的CommitLog 文件使用顺序写,所以性能较高。 除了消息存储文件之外,每个消息队列可能会有多个消费者,每个消费者都需要消费这些事件,而且消费的速度是不同的,所以需要根据消费者记录消息的消费状况。这部分数据就是消息消费队列文件。 消费队列文件的组织方式为 /topic/queue,同一个队列中存在多个文件,ConsumeQueue 设计是每个条目使用固定长度(8字节 CommitLog 物理偏移量、4字节消息长度、8字节 Tag HashCode),这里不是存储 tag 的原始字符串,而是存储 HashCode,目的就是确保每个条目的长度固定,可以使用访问类似数组下标的方式来快速定位条目,极大的提高了 ConsumeQueue文件的读取性能,试想一下,消息消费者根据 Topic、消息消费进度(ConsumeQueue 逻辑偏移量),即第几个… |
热门分类开源Golang消息队列JavaJavascriptLinuxMysqlNLPPHP事务内存管理分布式理论分类存储常用存储开源软件操作系统画图网络编程数据库算法虚拟化前端存储理论常用算法微服务数据结构算法应用计算机原理中间件共识算法分布式分治动态规划容器并发排序架构组件绘图工具网络协议编程语言理论算法思想树缓存架构C++字符串算法工程思想搜索
算法题库精选内容 |