动态
开发
阻塞队列BlockingQueue
简介BlockingQueue 阻塞队列,顾名思义,首先它是一个队列, 通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出 常用的队列主要有以下两种: 先进先出(FIFO):先插入的队列的元素也最先出队列,类似于排队的功能。从某种程度上来说这种队列也体现了一种公平性(实现公平锁) 后进先出(LIFO):后插入队列的元素最先出队列,这种队列优先处理最近发生的事件(栈) 多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模型中,通过队列可以很便利地实现两者之间的数据共享, 但如果生产者和消费者在某个时间段内,万一发生数据处理速度不匹配的情况呢? ...
转载
Nacos注册中心实现原理
本文为转载内容,来自作者:Zong_0915 原文访问地址:立刻访问 一、Nacos 介绍再讲 Nacos 之前,先来讲一下服务注册和发现。我们知道,现在微服务架构是目前开发的一个趋势。服务消费者要去调用多个服务提供者组成的集群。这里需要做到以下几点: 服务消费者需要在本地配置文件中维护服务提供者集群的每个节点的请求地址。 服务提供者集群中如果某个节点宕机,服务消费者的本地配置中需要同步删除这个节点的请求地址,防止请求发送到已经宕机的节点上造成请求失败。 因此需要引入服务注册中心,它具有以下几个功能: 服务地址的管理。 服务注册。 服务动态感知。 而 Nacos 致力于解决微服务中 ...
开发
Callable和Future接口以及FutureTask的实现
Callable 接口使用 Runnable 创建线程时,当线程终止时(即run()完成时),我们无法使线程返回结果。为了支持此功能,Java 中提供了 Callable 接口。 Callable 接口的特点如下 为了实现 Runnable,需要实现不返回任何内容的run()方法,而对于 Callable,需要实现在完成时返回结果的call()方法。 call()方法可以引发异常,而run()则不能。 为实现 Callable 而必须重写 call 方法 不能直接替换 runnable,因为 Thread 类的构造方法根本没有 Callable 1234567891011121314151 ...
开发
集合的线程安全
集合操作 Demo1234567891011121314151617public class NotSafeDemo { /** * 多个线程同时对集合进行修改 * @param args */ public static void main(String[] args) { List list = new ArrayList(); for (int i = 0; i < 10; i++) { new Thread(() ->{ ...
开发
JUC三大辅助类
JUC 中提供了三种常用的辅助类,通过这些辅助类可以很好的解决线程数量过多时 Lock 锁的频繁操作。这三种辅助类为: CountDownLatch: 减少计数 CyclicBarrier: 循环栅栏 Semaphore: 信号灯 减少计数 CountDownLatchCountDownLatch 类可以设置一个计数器,然后通过 countDown 方法来进行减 1 的操作,使用 await 方法等待计数器不大于 0,然后继续执行 await 方法之后的语句。 CountDownLatch 主要有两个方法:await()和countDown() 当一个或多个线程调用await方法时,这些 ...
开发
读写锁ReadWriteLock的介绍与使用
读写锁介绍现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。 针对这种场景,JAVA 的并发包提供了读写锁 ReentrantReadWriteLock,它表示两个锁,一个是读操作相关的锁,称为共享锁;一个是写相关的锁,称为排他锁 线程进入读锁的前提条件: 没有其他线程的写锁 没有写请求, 或者有写请求,但调用线程和持有锁的线程是同一个线程(可重入锁)。 线程进入写锁的前提条件: 没 ...
开发
线程间通信的几种方案
线程间通信模型线程间通信的模型有两种:共享内存和消息传递,以下方式都是基本这两种模型来实现的。 我们来基本一道面试常见的题目来分析 场景:两个线程,一个线程对当前数值加 1,另一个线程对当前数值减 1,要求用线程间通信 volatile 方案基于volatile关键字来实现线程间相互通信是使用共享内存的思想 大致意思就是多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务。这也是最简单的一种实现方式 首先定义一个实现类DemoClass 1234567891011121314151617181920212223242526272829303132333435363 ...
开发
lambda表达式
lambda 简介Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 使用 Lambda 表达式可以使代码变的更加简洁紧凑。 不采用 Lambda 的老方法: 123456Runnable runnable1=new Runnable(){ @Override public void run(){ System.out.println("Running without Lambda"); }}; 使 ...
开发
Java中的Lock接口
什么是 Lock在 Java 多线程编程中,我们经常使用 synchronized 关键字来实现同步,控制多线程对变量的访问,来避免并发问题。 Lock 锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。它们允许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对象。Lock 提供了比 synchronized 更多的功能。 Lock 不是 Java 中的关键字,而是 java.util.concurrent.locks 包中的一个接口,因此只能在代码块中进行使用,不能用来修饰方法。 Lock 与的 Synchronized 区别 Lock 不是 Java 语言内置的, ...
开发
Synchronized优化
Synchronized 关键字synchronized 是 Java 中的关键字,是一种同步锁。它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象 虽然可以使用 synchronized 来定义方法,但 synchronized 并不属于方法定义的一部分,因此,synchronized 关键字不能被继承。如果在父类中的某个方法使用了 synchronized 关键字,而在子类中覆盖了这个方法,在子类 ...