摘要:
微信公众号:房东的小黑黑 路途随遥远,将来更美好 学海无涯,大家一起加油! Condition条件队列 当我们进行线程间的通信时,可以使用ReetrantLock与Condition相结合,其中的await()和signal()方法进行线程间的阻塞与唤醒。我将详细的解释其中的机制。 Conditio 阅读全文
摘要:
什么是ThreadLocal 大家是否了解JMM(java内存模型),它主要是为了解决多线程下的共享内存操作问题,为了保证数据的一致性,我们在自己的工作内存操作修改变量后,会提交到主内存中进行覆盖,并且使其他线程中工作内存中的共享变量删除,使得其他线程在自己的工作内存中访问不到该共享变量副本,只能到 阅读全文
摘要:
AQS是并发编程的一个最基本组件,是一个抽象同步器。 网上有很多详细介绍AQS的博文,在这里我就不仔细介绍了,主要写一些重要的内容。 AQS中重要的几个属性: 由于一个共享资源同一时间可以被一条线程持有,也可以被多个线程持有,因此AQS中存在两种模式, 和`独占模式`。 共享模式是共享状态值stat 阅读全文
摘要:
在多线程情景下,如果不会某一共享变量采取一些同步机制,很可能发生数据不安全现象,比如购买车票时,当多个人购买时,不加锁就会产生多人买同一张票的现象,显然这是不可取的。所以要有一种同步机制,在某一时刻只能有一个线程处理该共享变量。 同步器的加锁 我将自己实现的同步器成为RoadAQS. 主要变量如下: 阅读全文
摘要:
什么是线程池 线程池实际上就是一个线程缓存集合,负责对线程进行统一分配、调优和调度。 线程是稀缺资源,它的创建与销毁是一个相对来说相对偏重且资源消耗的操作,而java线程依赖于内核线程,创建线程需要进行系统操作系统切换,为避免资源过度消耗需要重用线程执行多个线程。 线程池的好处 重用存在的线程,减少 阅读全文
摘要:
在1.7和1.8版本中,计算size()方法有写不同。先介绍1.7版本的实现。 1.7版本 在1.7版本中,有一个重要的类 ,利用它来实现分段锁 刚一开始不加锁,前后计算两次所有segment里面的数量大小和,两次结果相等,表明没有新的元素加入,计算的结果是正确的。如果不相等,就对每个segment 阅读全文
摘要:
ConcurrentHashMap解决了HashMap的线程不安全问题,在分析之前先介绍一个将HashMap线程安全的方法。利用 调用内部类 内部主要有两个变量,一个普通变量Map,还有一个互斥锁mutex。通过构造方法将外部的Map传入进去,如果没有要传入的mutex,则将引用 赋值给 ,就产生了 阅读全文
摘要:
在最近一段时间里,通过搜集有关资料加上自己的理解,设计了一款轻量级RPC,起了一个名字 lightWeightRPC 。它拥有一个RPC常见的基本功能。主要功能和特点如下: 利用Spring实现依赖注入与参数配置 利用Netty来实现客户端与服务端的远程通信 利用Hessian来实现序列化 设置Zo 阅读全文
摘要:
在本版本中引入了SPI机制,关于Java的SPI机制与Dubbo的SPI机制在以前的文章中介绍过。 传送门: "Dubbo的SPI机制与JDK机制的不同及原理分析" 因为设计的RPC框架是基于Spring的,时常会遇到依赖注入问题。Spring中也有SPI机制,但是它有有个缺点,就是在利用SPI机制 阅读全文
摘要:
在前两个版本中,每次发起请求一次就新建一个netty的channel连接,如果在高并发情况下就会造成资源的浪费,这时实现 异步请求 就十分重要,当有多个请求线程时,需要设计一个 线程池 来进行管理。除此之外,当前方法过于依赖注册中心,在高并发情况下对注册中心造成了压力;另外如果注册中心出现宕机等情况 阅读全文