<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[逆流而上的博客]]></title><description><![CDATA[但愿此生，逆流而上！]]></description><link>https://blog.youkuaiyun.com/weiwei_six</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; weiwei_six]]></copyright><item><title><![CDATA[Netty简介]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104542327</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104542327</guid><author>weiwei_six</author><pubDate>Thu, 27 Feb 2020 19:04:22 +0800</pubDate><description><![CDATA[一、什么是Netty
在网络编程领域，Netty是Java的卓越框架。它驾驭了Java高级API的能力，并将其隐藏在一个易于使用的API之后。Netty使你可以专注于自己真正的业务。简单的说，Netty是一个让网络编程变得简洁的框架，实现了真正的异步非阻塞，性能及其优越。
二、为什么选择Netty
通常，如果用NIO来实现一个服务端需要以下步骤。

创建ServerSocketChannel，配置...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---Fork/Join框架]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104381302</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104381302</guid><author>weiwei_six</author><pubDate>Tue, 18 Feb 2020 20:37:12 +0800</pubDate><description><![CDATA[一、什么是Fork/Join框架
Fork/Join框架是Java 7提供的一个用于并行执行任务的框架，是一个把大任务分割成若干个小任务，最终汇总每个小任务结果后得到大任务结果的框架。
我们再通过Fork和Join这两个单词来理解一下Fork/Join框架。Fork就是把一个大任务 切分为若干子任务并行的执行，Join就是合并这些子任务的执行结果，最后得到这个大任 务的结果。比如计算1+2+…+1...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---Java中的并发工具类CountDownLatch、CyclicBarrier、Semaphore、Exchanger]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104378832</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104378832</guid><author>weiwei_six</author><pubDate>Tue, 18 Feb 2020 18:17:49 +0800</pubDate><description><![CDATA[一、Java中的并发工具类
在JDK的并发包里提供了几个非常有用的并发工具类。CountDownLatch、 CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段，Exchanger工具类则提供了在线程间交换数据的一种手段。
二、CountDownLatch（等待多线程完成）
CountDownLatch允许一个或多个线程等待其他线程完成操作。
CountDownLat...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---LockSupport工具和Condition接口]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104268734</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104268734</guid><author>weiwei_six</author><pubDate>Sat, 15 Feb 2020 20:26:21 +0800</pubDate><description><![CDATA[一、LockSupport工具
LockSupport定义了一组的公共静态方法，这些方法提供了最基本的线程阻塞和唤醒功能，而LockSupport也成为构建同步组件的基础工具。
LockSupport定义了一组以park开头的方法用来阻塞当前线程，以及unpark(Thread thread)方法来唤醒一个被阻塞的线程。Park有停车的意思，假设线程为车辆，那么park方法代表着停车，而unpar...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---可重入锁和读写锁的实现原理、源码分析]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104266044</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104266044</guid><author>weiwei_six</author><pubDate>Tue, 11 Feb 2020 19:50:57 +0800</pubDate><description><![CDATA[一、重入锁
1.1 什么是重入锁
重入锁ReentrantLock，就是支持重进入的锁，它表示该锁能够支持一个线程对资源的重复加锁。除此之外，该锁的还支持获取锁时的公平和非公平性选择。
1.2 重入锁有什么用
例子：之前AQS的一个自己实现的锁
package com.example.demo.thread;

import java.util.concurrent.TimeUnit;
impor...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---AQS的实现原理、源码分析]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104253391</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104253391</guid><author>weiwei_six</author><pubDate>Tue, 11 Feb 2020 14:07:36 +0800</pubDate><description><![CDATA[一、同步队列
AQS依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理，当前线程获取同步状态失败时，同步器会将当前
线程以及等待状态等信息构造成为一个节点 (Node)并将其加入同步队列，同时会阻塞当前线程，当同步状态释放时，会
把首节点中的线程唤醒，使其再次尝试获取同步状态。
同步队列中的节点(Node)用来保存获取同步状态失败的线程引用、等待状态以及前一个节点和后一个节点，节点的属...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---Lock接口和AQS初识]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104201280</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104201280</guid><author>weiwei_six</author><pubDate>Mon, 10 Feb 2020 18:14:40 +0800</pubDate><description><![CDATA[一、 java中的锁
1.1 什么是锁
锁是用来控制多个线程访问共享资源的方式，一般来说，一个锁能够防止多个线程同 时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源，比如读写锁)。在 Lock接口出现之前，Java程序是靠synchronized关键字实现锁功能的，而Java SE 5之后， 并发包中新增了Lock接口(以及相关实现类)用来实现锁功能，它提供了与synchronized...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---线程池的创建和使用]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104199488</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104199488</guid><author>weiwei_six</author><pubDate>Thu, 06 Feb 2020 19:21:12 +0800</pubDate><description><![CDATA[一、线程池的使用
1.1 线程池的创建
我们可以通过ThreadPoolExecutor来创建一个线程池。
new ThreadPoolExecutor(int corePoolSize,
                       int maximumPoolSize,
                       long keepAliveTime,
                  ...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---线程池的实现原理]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104198965</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104198965</guid><author>weiwei_six</author><pubDate>Thu, 06 Feb 2020 17:38:06 +0800</pubDate><description><![CDATA[一、线程池简介
1.1 什么是线程池
所谓线程池，通俗的理解就是有一个池子，里面存放着已经创建好的线程，当有任务提交给线程池执行时，池子中的某个线程会主动执行该任务。如果池子中的线程数量不够应付数量众多的任务时，则需要自动扩充新的线程到池子中，但是该数量是有限的，就好比池塘的水界线一样。当任务比较少的时候，池子中的线程能够自动回收，释放资源。为了能够异步地提交任务和缓存未被处理的任务，需要有一个任...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---Hook线程]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104173814</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104173814</guid><author>weiwei_six</author><pubDate>Tue, 04 Feb 2020 20:44:45 +0800</pubDate><description><![CDATA[一、Hook 线程介绍
JVM进程的退出是由于JVM进程中没有活跃的非守护线程，或者收到了系统中断信号，向JVM程序注人一个Hook线程，在JVM进程退出的时候，Hook线程会启动执行,通过Runtime可以为JVM注人多个Hook线程。
二、简单例子
/**
 * @author : pengweiwei
 * @date : 2020/2/4 7:32 下午
 */
public class ...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---线程间通信]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104136949</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104136949</guid><author>weiwei_six</author><pubDate>Mon, 03 Feb 2020 19:46:30 +0800</pubDate><description><![CDATA[一、线程间通信
线程开始运行，拥有自己的栈空间，就如同一个脚本一样，按照既定的代码一步一步地执行，直到终止。但是，每个运行中的线程，如果仅仅是孤立地运行，那么没有一点儿 价值，或者说价值很少，如果多个线程能够相互配合完成工作，这将会带来巨大的价值。
二、等待/通知机制
等待/通知机制，是指一个线程A调用了对象O的wait()方法进入等待状态，而另一个 线程B调用了对象O的notify()或者not...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---Thread API详解]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104147624</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104147624</guid><author>weiwei_six</author><pubDate>Sun, 02 Feb 2020 20:38:05 +0800</pubDate><description><![CDATA[Thread API详解
一、线程sleep
sleep方法是一个静态方法。他有两个重载方法。
 public static native void sleep(long millis) throws InterruptedException;
 public static void sleep(long millis, int nanos) throws InterruptedException...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---volatile和synchronized关键字详解]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104136985</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104136985</guid><author>weiwei_six</author><pubDate>Sat, 01 Feb 2020 19:15:59 +0800</pubDate><description><![CDATA[一、简介
在多线程并发编程中synchronized和volatile都扮演着重要的角色，volatile是轻量级的 synchronized，它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个 线程修改一个共享变量时，另外一个线程能读到这个修改的值。如果volatile变量修饰符使 用恰当的话，它比synchronized的使用和执行成本更低，因为它不会引起线程上下文的切 换和调...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---线程的构建、启动和停止]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104136571</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104136571</guid><author>weiwei_six</author><pubDate>Sat, 01 Feb 2020 18:37:09 +0800</pubDate><description><![CDATA[一、构造线程
在运行线程之前首先要构造一个线程对象，线程对象在构造的时候需要提供线程所需要的属性，如线程所属的线程组、线程优先级、是否是Daemon线程等信息。下面代码摘自java.lang.Thread中对线程进行初始化的部分。
private void init(ThreadGroup g, Runnable target, String name,
                     ...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---线程知识简介]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104133837</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104133837</guid><author>weiwei_six</author><pubDate>Sat, 01 Feb 2020 15:55:51 +0800</pubDate><description><![CDATA[一、什么是线程
操作系统在运行一个程序时，会为其创建一个进程（就是windows任务管理器看到的那些运行的进程）。例如，启动一个Java程序， 操作系统就会创建一个Java进程。现代操作系统调度的最小单元是线程，也叫轻量级进程 (Light Weight Process)，在一个进程里可以创建多个线程，这些线程都拥有各自的计数器、堆栈和局部变量等属性，并且能够访问共享的内存变量。处理器利用程序计数...]]></description><category></category></item><item><title><![CDATA[Java并发编程系列---上下文切换和死锁]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104127724</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104127724</guid><author>weiwei_six</author><pubDate>Fri, 31 Jan 2020 20:51:35 +0800</pubDate><description><![CDATA[一、上下文切换
即使是单核处理器也支持多线程执行代码，CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间，因为时间片非常短，所以CPU通过不停地切换线程执行，让我们感觉多个线程是同时执行的，时间片一般是几十毫秒 (ms)。
CPU通过时间片分配算法来循环执行任务，当前任务执行一个时间片后会切换到下一 个任务。但是，在切换前会保存上一个任务的状态，以便下次切换回这...]]></description><category></category></item><item><title><![CDATA[RabbitMQ实现可靠性消息投递---保证消费者接收到消息]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104125521</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104125521</guid><author>weiwei_six</author><pubDate>Fri, 31 Jan 2020 17:05:09 +0800</pubDate><description><![CDATA[一、保证可靠性消息投递
首先需要明确，效率与可靠性是无法兼得的，如果要保证每一个环节都成功，势必会对消息的收发效率造成影响。 如果是一些业务实时一致性要求不是特别高的场合，可以牺牲一些可靠性来换取效率。
在消息投递过程中，一共有四处需要保证可靠性。如图。


①代表消息从生产者发送到Exchange;
②代表消息从Exchange路由到Queue;
③代表消息在Queue中存储;
④代表消费者订阅...]]></description><category></category></item><item><title><![CDATA[Springboot整合RabbitMQ实现发送接收消息]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104117743</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104117743</guid><author>weiwei_six</author><pubDate>Thu, 30 Jan 2020 19:47:07 +0800</pubDate><description><![CDATA[一、发送消息的步骤

二、项目准备
新建两个springboot项目，分别取名为producer 和 consumer。新建项目的时候引入Rabbitmq依赖。或者手动添加。
		&lt;dependency&gt;
			&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
			&lt;artifactId&gt;spring-boot...]]></description><category></category></item><item><title><![CDATA[RabbitMQ入门介绍以及安装使用]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104108709</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104108709</guid><author>weiwei_six</author><pubDate>Wed, 29 Jan 2020 19:54:25 +0800</pubDate><description><![CDATA[一、RabbitMQ初识
RabbitMQ是一个实现了高级消息队列协议（AMQP的消息代理(也叫消息中间件)，它接受并转发消息。它可以帮你处理一些逻辑的事务，从而进行解耦，比如用户注册落库之后，还需要发送邮件验证、需要发送新人红包等等事情，就可以交给中间件去做。也可以把它当成一个邮局：当你想邮寄信件的时候，你会把信件放在投递箱中，并确信邮递员最终会将信件送到收件人的手里。在这个例子中，Rabbit...]]></description><category></category></item><item><title><![CDATA[NIO的网络IO操作]]></title><link>https://blog.youkuaiyun.com/weiwei_six/article/details/104101889</link><guid>https://blog.youkuaiyun.com/weiwei_six/article/details/104101889</guid><author>weiwei_six</author><pubDate>Tue, 28 Jan 2020 19:46:33 +0800</pubDate><description><![CDATA[一、网络IO
1.1 概述
文件IO用到的FileChannel并不支持非阻塞操作，学习NIO主要就是进行网络IO，JavaNIO中的网络通道是非阻塞10的实现，基于事件驱动，非常适用于服务器需要维持大量连接，但是数据交换量不大的情况，例如一些即时通信的服务等…
在Java中编写Socket服务器，通常有以下几种模式:

一个客户 端连接用一个线程，优点:程序编写简单;缺点:如果连接非常多，分配的...]]></description><category></category></item></channel></rss>