Java 各种锁机制
Java 提供了多种锁机制,以满足不同的并发场景需求。
- synchronized 关键字:这是 Java 内置的同步机制,能够保障同一时刻只有一个线程可以访问被其修饰的代码块或者方法。
- ReentrantLock:它是一个可重入的互斥锁,功能上比 synchronized 更为强大,能够实现公平锁和非公平锁。
- ReadWriteLock:它将读写操作进行了分离,允许多个线程同时进行读操作,但写操作时会进行互斥。
线程池机制
线程池能够管理和复用线程,从而减少线程创建和销毁带来的开销。Java 提供了 ExecutorService 接口及其实现类来实现线程池
AQS 的核心思想
AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。 CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列(虚拟的双向队列即不存在队列实例,仅存在结点之间的关联关系)。AQS是将每条请求共享资源的线程封装成一个CLH锁队列的一个结点(Node)来实现锁的分配。 AQS使用一个int成员变量来表示同步状态,通过内置的FIFO队列来完成获取资源线程的排队工作。AQS使用CAS对该同步状态进行原子操作实现对其值的修改。
http 和https的区别
-
定义与功能:HTTP 是一种用于在网络上传输超文本(如 HTML 页面、图片、视频等)的应用层协议。它规定了客户端(如浏览器)和服务器之间如何进行请求和响应,使得用户能够通过浏览器访问各种网站和获取信息。
-
定义与功能:HTTPS 是在 HTTP 的基础上加入了 SSL/TLS(安全套接层 / 传输层安全)协议,用于对数据进行加密和身份验证,确保数据在传输过程中的安全性和完整性。
java NIO
Java NIO(New Input/Output)是 Java 1.4 版本引入的一套新的 I/O API,它提供了与标准 Java I/O 不同的处理方式,在高并发、高性能的网络编程和文件处理等场景中表现出色。下面从核心组件、工作模式、示例代码等方面为你详细介绍 Java NIO。
核心组件
- 通道(Channel):它是对原 I/O 中流的模拟,是数据传输的媒介,用于连接数据源和数据目标,像文件、套接字等。通道可以进行双向的数据读写操作,主要的实现类有 FileChannel、SocketChannel、ServerSocketChannel 和 DatagramChannel。
- 缓冲区(Buffer):它是一个用于存储数据的容器,本质上是一个数组。所有的数据都要通过缓冲区进行读写,常用的缓冲区类型有 ByteBuffer、CharBuffer、IntBuffer 等。
- 选择器(Selector):它是 Java NIO 实现非阻塞 I/O 的关键组件,能够检测多个通道的 I/O 事件,如连接、读、写等。一个选择器可以管理多个通道,从而实现单线程处理多个通道的 I/O 操作,大大提高了系统的并发性能。
工作模式
Java NIO 有两种主要的工作模式:
- 阻塞模式:在这种模式下,通道的读写操作会阻塞当前线程,直到操作完成。这和传统的 Java I/O 类似。
- 非阻塞模式:在非阻塞模式下,通道的读写操作不会阻塞当前线程,而是会立即返回结果。若没有数据可读或可写,操作会返回 0 或者 -1。结合选择器,能够实现单线程处理多个通道的 I/O 事件。
Spring Cloud 5大组件有哪些
- Eureka:服务注册中心。
- Ribbon:客户端负载均衡器。
- Feign:声明式的服务调用。
- Hystrix:服务熔断器。
- Zuul/Gateway:API网关。
RabbitMQ
是一个在 AMQP(高级消息队列协议)基础上实现的,开源、功能强大且应用广泛的消息中间件。
核心概念
- 生产者(Producer):负责创建消息并将其发送到 RabbitMQ 服务器。生产者不需要知道消息会被哪个消费者接收,它只需要把消息发送到指定的交换机即可。
- 消费者(Consumer):从 RabbitMQ 服务器接收消息并进行处理。消费者监听特定的队列,一旦队列中有新消息,就会将其取出进行消费。
- 交换机(Exchange):接收生产者发送的消息,并根据路由规则将消息路由到一个或多个队列中。交换机有不同的类型,如直连交换机(Direct Exchange)、扇形交换机(Fanout Exchange)、主题交换机(Topic Exchange)和头部交换机(Headers Exchange)。
- 队列(Queue):是消息的存储缓冲区,用于存储交换机路由过来的消息。多个消费者可以从同一个队列中消费消息,队列可以实现消息的异步处理和削峰填谷。
- 绑定(Binding):用于建立交换机和队列之间的关联关系,通过绑定键(Binding Key)来指定交换机将消息路由到哪些队列。