简栈文化

Java技术人的成长之路~


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

Reactor模型的Java NIO实现

发表于 2020-03-19 | 更新于: 2020-08-02 | 分类于 Java
实现Reactor模型可分为以下三种: 单线程模型 单Reactor多线程模型 主从Reactor多线程模型。 单线程模型Reactor单线程模型,指的是所有的IO操作都在同一个线程上面完成,线程的职责如下: 作为NIO服务端,接收客户端的TCP连接; 作为NIO客户端,向服务端发起TCP连接; 读取通信对端的请求或者应答消息; 向通信对端发送消息请求或者应答消息。 由于Reactor模式使用的是异步非阻塞IO,所有的IO操作都不会导致阻塞,理论上一个线程可以独立处理所有IO相关的操作。从架构层面看,一个NIO线程确实可以完成其承担的职责。例如,通过Acceptor接收客户端的TCP连接请求消息,链路建立成功之后,通过Dispatch将对应的ByteBuffer派发到指定的Handler上进行消息解码。用户线程可以通过消息编码通过NIO线程将消息发送给客户端。 Server端123456789101112131415161718192021222324252627282930313233343536373839public class Reactor1 { ...
阅读全文 »

MYSQL MVCC实现原理

发表于 2020-03-18 | 更新于: 2020-08-02 | 分类于 MySQL
MySQL是现在最流行的关系型数据库(RDB)的选择,创建一个应用时,无论是用户数据还是订单数据,使用关系型数据库存储是最可靠稳定的选择,借助RDB提供的可靠性、事务等功能,为应用提供完善的支持。MySQL是开源软件,可以免费使用,MySQL在发展多年后越来越成熟,成为大部分公司的数据库首选。MySQL采用插件式的存储引擎架构,5.5版本后默认使用InnoDB存储引擎。 MySQL架构MySQL从概念上可以分为四层: 第一层是接入层: 不同语言的客户端通过mysql的协议与mysql服务器进行连接通信,接入层进行权限验证、连接池管理、线程管理等。 第二层是服务层: 包括sql解析器、sql优化器、数据缓冲、缓存等。 第三层是存储引擎层: mysql中存储引擎是基于表的。 第四层是系统文件层: 保存数据、索引、日志等。 MVCCMVCC是Multi Version Concurrency Control的简称,代表多版本并发控制。为什么需要MVCC,还要从数据库事务的ACID特性说起。相信很多朋友都了解ACID,它们分别代表了 Atomicity(原子性) Consistency( ...
阅读全文 »

Mongodb分片集群部署

发表于 2020-03-17 | 更新于: 2020-08-02 | 分类于 Mongodb
Mongodb分片概括 分片在多台服务器上分布数据的方法, Mongodb使用分片来支持具有非常大的数据集和高吞吐量的操作的部署 具有大数据集和高吞吐量应用程序的数据库系统,可以挑战单台服务器的容量。 例如,高查询率可以耗尽服务器的cpu容量,工作集大小大于系统的RAM强制磁盘驱动器的I/O容量, 有两种方法来解决系统增长:垂直和水平缩放。 垂直缩放 涉及增加的单个服务器的容量,例如使用更强大的CPU,加入更多的RAM,或增加的存储空间量。可用技术中的限制可能限制单个机器对于给定工作负载足够强大。此外,基于云的提供商具有基于可用硬件配置的硬上限。因此,对于垂直缩放存在实际的最大值。 包括将系统数据和负载在多个服务器,添加额外的服务器,需要增加容量。虽然单个机器的总速度或容量可能不高,但是每个机器处理整个工作负载的子集,潜在地提供比单个高速大容量服务器更好的效率。扩展部署的容量仅需要根据需要添加额外的服务器,这可以是比单个机器的高端硬件低的总体成本。权衡是基础设施的复杂性和部署的维护。 Mongodb的支持水平扩展,分片。 分片目的对于单台数据库服务器,庞大的数据量及高吞吐量的应用 ...
阅读全文 »

Java新生代老年代的划分及回收算法

发表于 2020-03-16 | 更新于: 2020-08-02 | 分类于 Java
Java堆(Java Heap)是JVM所管理的最大内存区域,也是所有线程共享的一块区域,在JVM启动时创建。 此内存区域存放的都是对象的实例和数组。JVM规范中说到:”所有的对象实例以及数组都要在堆上分配”。 Java堆是垃圾回收器管理的主要区域,百分之九十九的垃圾回收发生在Java堆,另外百分之一发生在方法区,因此又称之为”GC堆”。根据JVM规范规定的内容,Java堆可以处于物理上不连续的内存空间中。 当前JVM对于堆的垃圾回收,采用分代收集的策略。根据堆中对象的存活周期将堆内存分为新生代和老年代。在新生代中,每次垃圾回收都有大批对象死去,只有少量存活。而老年代中存放的对象存活率高。 这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。 标记清除算法标记清除算法是最基础的回收算法,分为标记和清除两个部分:首先标记出所有需要回收的对象,这一过程在可达性分析过程中进行。在标记完之后统一回收所有被标记的对象。 标记清除算法有如下不足 效率问题 标记和清除这两个过程的效率不高 空间问题 清除之后会产生大量不连续的内存碎片,内存碎片太多会导致以后的 ...
阅读全文 »

Java线程与Linux内核线程的映射关系

发表于 2020-03-15 | 更新于: 2020-08-02 | 分类于 Java
Java线程与Linux内核线程的映射关系Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程。 Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是由JVM的实现来确定的。Linux 2.6上的HotSpot使用了NPTL机制,JVM线程跟内核轻量级进程有一一对应的关系。线程的调度完全交给了操作系统内核,当然jvm还保留一些策略足以影响到其内部的线程调度,举个例子,在linux下,只要一个Thread.run就会调用一个fork产生一个线程。 Java线程在Windows及Linux平台上的实现方式,现在看来,是内核线程的实现方式。这种方式实现的线程,是直接由操作系统内核支持的——由内核完成线程切换,内核通过操纵调度器(Thread Scheduler)实现线程调度,并将线程任务反映到各个处理器上。内核线程是内核的一个分身。程序一般不直接使用该内核线程,而是使用其高级接口,即轻量级进程(LWP),也即线程。这看起来可能很拗口。看图: (说明:KLT即内核线程Kernel Thread,是“ ...
阅读全文 »

Java线程的6种状态及切换

发表于 2020-03-14 | 更新于: 2020-08-02 | 分类于 Java
Java中线程的状态分为6种。 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。 阻塞(BLOCKED):表示线程阻塞于锁。 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。 终止(TERMINATED):表示该线程已经执行完毕。 这6种状态定义在Thread类的State枚举中,可查看源码进行一一对应。 线程的状态图 初始状态实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态。 就绪状态就绪状态只是说你资格 ...
阅读全文 »

Java并发编程系列:ReentrantLock

发表于 2020-03-13 | 更新于: 2020-08-02 | 分类于 Java
简介ReentrantLock和synchronized都是提供了同步的功能,JDK1.6之后对synchronized性能进行了优化,所以两者的性能上几乎没什么区别,但是ReentrantLock提供了了一些高级功能。 等待可中断:在synchronized中,如果一个线程在等待锁,他只用两种结果,要么获得锁执行完,要么一直保持等待。可中断的等待是通知正在等待的线程,告诉他没必要再等待后。 实现公平锁:公平锁:会按照时间的先后顺序,保证先到先得。特点是它不会产生饥饿现象。而synchroized关键字进行所控制时,锁是非公平的。而重入锁可以设置为公平锁。 public ReetranLock(boolean fair) 当fair为true时,表示锁是公平的。实现公平锁必然要求系统维护一个有序队列,因此公平锁的成本比较高,性能也非常低向。默认情况下锁是非公平的。 绑定多个条件:类似于Object类的wait和notify方法,它是与ReentrantLock绑定的条件,可以绑定多个条件。 一个简单的例子注意:退出临界区要释放锁,否则其他线程就没有机回访问临界区了。 1234 ...
阅读全文 »

Java并发编程:任务的取消和关闭

发表于 2020-03-12 | 更新于: 2020-08-02 | 分类于 Java
前言任务和线程的启动很容易。在大多数时候,我们都会让它们运行直到结束,或者让它们自行停止。然而,有时候我们希望提前结束任务或线程,或许是因为用户取消了操作,或者应用程序需要被快速关闭。 要使任务和线程能安全、快速、可靠地停止下来,并不是一件容易的事。Java 没有提供任何机制来安全的终止线程。但它提供了中断,这是一种协作机制,能够使一个线程终止另一个线程的当前工作。 这种协作式的方法是必要的,我们很少希望某个任务、线程或服务立即停止,因为这种立即停止会使共享的数据结构处于不一致的状态。相反,在编写任务和服务时可以使用一种协作的方式:当需要停止时,它们首先会清除当前正在执行的工作,然后再结束。这提供了更好的灵活性,因为任务本身的代码比发出取消请求的代码更清除如何执行清除工作。 正题在开始文章前,有几个问题需要思考一下: 取消任务的方式由哪几种? 中断的策略是什么? 如何响应中断? 取消任务的方式有哪几种取消任务的方式大体上有一下两种: 设置取消标志位 中断 设置取消标志位设置某个“已请求取消”标志,而任务将定期地查看该标志。如果设置了这个标记,那么任务将提前结束。 1234567 ...
阅读全文 »

G1垃圾收集器详细介绍

发表于 2020-03-11 | 更新于: 2020-08-02 | 分类于 Java
1、G1垃圾收集器介绍G1垃圾收集器针对具有大量内存的多处理器机器。它试图以很高的概率满足GC停顿时间目标,同时实现高吞吐量且几乎不需要配置。G1旨在在延迟和吞吐量之间提供最佳平衡,应用场景包括如下环境特征: 堆大小可达10 GB或更大,超过50%的Java堆占用实时数据。 随着时间的推移,对象分配速度和晋升(从新生代到老年代的晋升)速度会发生显著变化。 堆中大量的碎片。 可预测的时间停顿目标不超过几百毫秒,避免长时间垃圾收集停顿。 G1取了CMS,G1也是默认的收集器(JVM9、JVM10)。 G1收集器有很高的性能,并尝试通过以下几节所述的几种方式来满足停顿时间的目标。 2、启用G1收集器G1是默认收集器,因此通常不需要执行任何其他操作。您可以通过在命令行上提供-XX:+ UseG1GC来显式启用它。 3、基本概念G1是分代的、增量的、并行、大部分、并发的、stop-the-word、以及疏散(将活着的对象从一个区域(youngor young + old)拷贝到另一个区域)的垃圾收集器,用于监视每个stop-the-word停顿的停顿时间目标。与其他收集器类似,G1将堆分成( ...
阅读全文 »

BlockingQueue是如何把线程玩的如此之牛的?

发表于 2020-03-10 | 更新于: 2020-08-02 | 分类于 Java
前言BlockingQueue即阻塞队列,它算是一种将ReentrantLock用得非常精彩的一种表现,依据它的基本原理,我们可以实现Web中的长连接聊天功能,当然其最常用的还是用于实现生产者与消费者模式,大致如下图所示: 在Java中,BlockingQueue是一个接口,它的实现类有ArrayBlockingQueue、DelayQueue、 LinkedBlockingDeque、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等,它们的区别主要体现在存储结构上或对元素操作上的不同,但是对于take与put操作的原理,却是类似的。下面的源码以ArrayBlockingQueue为例。 分析BlockingQueue内部有一个ReentrantLock,其生成了两个Condition,在ArrayBlockingQueue的属性声明中可以看见: 1234567891011121314151617/** Main lock guarding all access */final ReentrantLock lock ...
阅读全文 »
上一页1…678…15下一页
Vernon

Vernon

149 日志
66 分类
87 标签
RSS
GitHub E-Mail
© 2021 Vernon
由 Hexo 强力驱动
|
主题 — NexT.Gemini v6.0.4