Netty简介 一、什么是Netty在网络编程领域,Netty是Java的卓越框架。它驾驭了Java高级API的能力,并将其隐藏在一个易于使用的API之后。Netty使你可以专注于自己真正的业务。简单的说,Netty是一个让网络编程变得简洁的框架,实现了真正的异步非阻塞,性能及其优越。二、为什么选择Netty通常,如果用NIO来实现一个服务端需要以下步骤。创建ServerSocketChannel,配置...
Java并发编程系列---Fork/Join框架 一、什么是Fork/Join框架Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。我们再通过Fork和Join这两个单词来理解一下Fork/Join框架。Fork就是把一个大任务 切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任 务的结果。比如计算1+2+…+1...
Java并发编程系列---Java中的并发工具类CountDownLatch、CyclicBarrier、Semaphore、Exchanger 一、Java中的并发工具类在JDK的并发包里提供了几个非常有用的并发工具类。CountDownLatch、 CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程间交换数据的一种手段。二、CountDownLatch(等待多线程完成)CountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLat...
Java并发编程系列---LockSupport工具和Condition接口 一、LockSupport工具LockSupport定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也成为构建同步组件的基础工具。LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及unpark(Thread thread)方法来唤醒一个被阻塞的线程。Park有停车的意思,假设线程为车辆,那么park方法代表着停车,而unpar...
Java并发编程系列---可重入锁和读写锁的实现原理、源码分析 一、重入锁1.1 什么是重入锁重入锁ReentrantLock,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁的还支持获取锁时的公平和非公平性选择。1.2 重入锁有什么用例子:之前AQS的一个自己实现的锁package com.example.demo.thread;import java.util.concurrent.TimeUnit;impor...
Java并发编程系列---AQS的实现原理、源码分析 一、同步队列AQS依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成为一个节点 (Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。同步队列中的节点(Node)用来保存获取同步状态失败的线程引用、等待状态以及前一个节点和后一个节点,节点的属...
Java并发编程系列---Lock接口和AQS初识 一、 java中的锁1.1 什么是锁锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同 时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。在 Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后, 并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized...
Java并发编程系列---线程池的创建和使用 一、线程池的使用1.1 线程池的创建我们可以通过ThreadPoolExecutor来创建一个线程池。new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ...
Java并发编程系列---线程池的实现原理 一、线程池简介1.1 什么是线程池所谓线程池,通俗的理解就是有一个池子,里面存放着已经创建好的线程,当有任务提交给线程池执行时,池子中的某个线程会主动执行该任务。如果池子中的线程数量不够应付数量众多的任务时,则需要自动扩充新的线程到池子中,但是该数量是有限的,就好比池塘的水界线一样。当任务比较少的时候,池子中的线程能够自动回收,释放资源。为了能够异步地提交任务和缓存未被处理的任务,需要有一个任...
Java并发编程系列---Hook线程 一、Hook 线程介绍JVM进程的退出是由于JVM进程中没有活跃的非守护线程,或者收到了系统中断信号,向JVM程序注人一个Hook线程,在JVM进程退出的时候,Hook线程会启动执行,通过Runtime可以为JVM注人多个Hook线程。二、简单例子/** * @author : pengweiwei * @date : 2020/2/4 7:32 下午 */public class ...
Java并发编程系列---线程间通信 一、线程间通信线程开始运行,拥有自己的栈空间,就如同一个脚本一样,按照既定的代码一步一步地执行,直到终止。但是,每个运行中的线程,如果仅仅是孤立地运行,那么没有一点儿 价值,或者说价值很少,如果多个线程能够相互配合完成工作,这将会带来巨大的价值。二、等待/通知机制等待/通知机制,是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个 线程B调用了对象O的notify()或者not...
Java并发编程系列---Thread API详解 Thread API详解一、线程sleepsleep方法是一个静态方法。他有两个重载方法。 public static native void sleep(long millis) throws InterruptedException; public static void sleep(long millis, int nanos) throws InterruptedException...
Java并发编程系列---volatile和synchronized关键字详解 一、简介在多线程并发编程中synchronized和volatile都扮演着重要的角色,volatile是轻量级的 synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个 线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使 用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切 换和调...
Java并发编程系列---线程的构建、启动和停止 一、构造线程在运行线程之前首先要构造一个线程对象,线程对象在构造的时候需要提供线程所需要的属性,如线程所属的线程组、线程优先级、是否是Daemon线程等信息。下面代码摘自java.lang.Thread中对线程进行初始化的部分。private void init(ThreadGroup g, Runnable target, String name, ...
Java并发编程系列---线程知识简介 一、什么是线程操作系统在运行一个程序时,会为其创建一个进程(就是windows任务管理器看到的那些运行的进程)。例如,启动一个Java程序, 操作系统就会创建一个Java进程。现代操作系统调度的最小单元是线程,也叫轻量级进程 (Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器利用程序计数...
Java并发编程系列---上下文切换和死锁 一、上下文切换即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒 (ms)。CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一 个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这...
RabbitMQ实现可靠性消息投递---保证消费者接收到消息 一、保证可靠性消息投递首先需要明确,效率与可靠性是无法兼得的,如果要保证每一个环节都成功,势必会对消息的收发效率造成影响。 如果是一些业务实时一致性要求不是特别高的场合,可以牺牲一些可靠性来换取效率。在消息投递过程中,一共有四处需要保证可靠性。如图。①代表消息从生产者发送到Exchange;②代表消息从Exchange路由到Queue;③代表消息在Queue中存储;④代表消费者订阅...
Springboot整合RabbitMQ实现发送接收消息 一、发送消息的步骤二、项目准备新建两个springboot项目,分别取名为producer 和 consumer。新建项目的时候引入Rabbitmq依赖。或者手动添加。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot...
RabbitMQ入门介绍以及安装使用 一、RabbitMQ初识RabbitMQ是一个实现了高级消息队列协议(AMQP的消息代理(也叫消息中间件),它接受并转发消息。它可以帮你处理一些逻辑的事务,从而进行解耦,比如用户注册落库之后,还需要发送邮件验证、需要发送新人红包等等事情,就可以交给中间件去做。也可以把它当成一个邮局:当你想邮寄信件的时候,你会把信件放在投递箱中,并确信邮递员最终会将信件送到收件人的手里。在这个例子中,Rabbit...
NIO的网络IO操作 一、网络IO1.1 概述文件IO用到的FileChannel并不支持非阻塞操作,学习NIO主要就是进行网络IO,JavaNIO中的网络通道是非阻塞10的实现,基于事件驱动,非常适用于服务器需要维持大量连接,但是数据交换量不大的情况,例如一些即时通信的服务等…在Java中编写Socket服务器,通常有以下几种模式:一个客户 端连接用一个线程,优点:程序编写简单;缺点:如果连接非常多,分配的...