
java
文章平均质量分 66
路行的亚洲
学习的时候,想着学习,接着就是练习与反思,因为学习本来就是一个学与习的过程,虽然我走得很慢!
展开
-
基于双向链表实现无锁队列
由于链表的特性,因此可以知道其进行添加元素或者删除元素只需要进行节点的改变即可,同时不需要考虑扩容和缩容的问题,比较方便。那实现队列,需要的是生产者和消费者的模型。其本质是执行进队和出队操作。 代码源于https://github.com/takumiCX/beautiful-concurrent。那么怎样才能实现一个并发无锁的队列呢?首先需要考虑队列是基于链表的,因此我们能操作它的前驱节点和后继节点,同时对数据需要存储到队列中,然后进行消费。为了解决并发问题,我们采用乐观锁+volatile的方式实现。原创 2021-03-23 15:46:35 · 662 阅读 · 0 评论 -
NIO学习四-Selector
前面我们已经简单的学习了channel,知道channel作为通道,可以在通道中进行读写操作,同时知道ByteChannel是双向的。对于NIO的优势在于多路复用选择器上,在Nginx、Redis、Netty中都有多路复用的体现。因此学习Selector是有必要的。1.使用多路复用选择器的方式/** * selector 选择器 多路复用,选择器结合selectable-channel实现非阻塞效果,提高效率 * 可以将通道注册进选择器中,其主要注意是使用一个线程来对多个通道中的已就绪进行选择,然后原创 2020-08-01 20:08:32 · 175 阅读 · 0 评论 -
NIO学习三-Channel
在学习NIO时,ByteBuffer、Channel、Selector三个组件是必须了解的。前面我们说到ByteBuffer是作为缓冲区进行数据的存放或者获取。通常我们需要进行flip翻转操作,但是这个在Netty中,有一个更为强大的类可以替代ByteBuf,其不需要进行翻转,也可以进行读写的双向操作。要将数据打包到缓冲区中,通常需要使用通道,而通道作为传输数据的载体,也即它可以使数据从一端到另一端,因此就必须进行了解。Channel中,我们也看到其子类有很多,通常都是用于读写操作的。其中ByteChan原创 2020-08-01 20:07:25 · 964 阅读 · 0 评论 -
NIO学习二-ByteBuffer
前面我们已经了解到Buffer中,0<=mark<=postion<=limit<=capacity。其中mark是标记,如果为-1时丢弃。postion是当前位置,limit是限制,也即上界。capacity是容量。同时了解了直接缓冲区与缓冲区的底层实现是不同的,缓冲区是基于数组的,而直接缓冲区是基于内存的。同时可以基于反射,拿到cleaner,进而拿到clean进行清理。同时clear是还原缓冲区的状态,flip是反转缓冲区的,rewind重绕缓冲区,标记清除。remianing原创 2020-08-01 20:06:02 · 343 阅读 · 0 评论 -
NIO学习一-Buffer
NIO相比普通IO提供了功能更为强大、处理数据更快的解决方案。常用于高性能服务器上。NIO实现高性能处理的原理是使用较少的线程来处理更多的任务常规io使用的byte[]、char[]进行封装,而NIO采用ByteBuffer类来操作数据,再结合针对File或socket技术的channel,采用同步非阻塞技术来实现高性能处理,而Netty正是采用ByteBuffer(缓冲区)、Channel(通道)、Selector(选择器)进行封装的。因此我们需要先了解NIO相关的知识。NIO相关知识:首先原创 2020-08-01 20:04:08 · 203 阅读 · 0 评论 -
CompletableFuture学习
前面我们已经知道CompletionService是可以解决Future带来的阻塞问题的,同时我们除了前面我们看到的take方法之外,还可以使用poll方法,这样可以使你的程序免受阻塞之苦。因为poll方法也是无阻塞性的。同时在kafka的源码中,我们如果使用消费者的话,可以看到会使用一个基于future的poll方法。同时我们可以在dubbo的新版本2.7中,可以看到其异步编程采用的就是我们要介绍的CompletableFuture。因此,我们有必要了解CompletableFuture,同时原创 2020-08-01 20:01:46 · 194 阅读 · 0 评论 -
CompletionService学习
前面已经说到Future的默认实现是FutureTask,因此你可以看到其在jdk1.5的时候采用的是AQS去实现的,因此具有阻塞性,但jdk1.6之后,可以看到其基于CAS实现的。之所以学习Future,除了其具备异步功能,同时其采用的思想也是在设计模式中有体现的,也即Future模式,而且可以在kafka源码中看到基于Future构建的异步编程。前面说到其基于AQS具有阻塞性,但从源码中,可以看到在jdk1.6之后采用的是CAS:public V get(long timeout, TimeUnit原创 2020-08-01 19:58:46 · 214 阅读 · 0 评论 -
Future和Callable学习
我们知道使用多线程时,最初的Thread到线程池,此时对于线程的使用,提供了其使用的复用率。而实现多线程的三种方式:继承Thread;实现Runnable接口,重写run方法;实现Callable接口,同时重写call方法,同时通过Future获取执行的返回值。也就是说callable执行任务,而Future拿到执行的结果。Future具有阻塞性在于其get()方法具有阻塞性,而isDone()是不具有阻塞性的。通常使用线程池+Runnable的时候,会发现Runnable不能返回值,也就执行的结果情况,原创 2020-05-24 21:31:50 · 335 阅读 · 0 评论 -
java8学习整理二
java8不但可以提高代码的运行的性能,而且实现起来很优雅,因此学习它是不错的选择。今天写这篇文章,是因为看到我们部门大佬写的代码,因此将其还原成匿名内部类的时候发现这个retrun是不能省掉的,省去会报错。同时还可以学习到map如果在筛选条件中只有一行的时候,是可以不需要return的,这个是与中间有处理过程是不同的。因此就有了下面的学习:public List<CmPatientBasePO> listAll(Integer fkHospId, Integer fkTenantId) {原创 2020-05-24 08:22:56 · 183 阅读 · 0 评论 -
java8学习整理
由于项目中使用java8中的lambda表达式,因此想学习一下java8中的lambda表达式和stream流。Lambda表达式的格式:(匿名内部类被重写方法的形参列表)->{被重写方法的方法体代码}例如:public class LambdaDemo1 {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() { System.out.print原创 2020-05-24 08:17:07 · 269 阅读 · 0 评论 -
对前端传入的json对象解析成多个对象
在我们的项目中可以看到很多类似的multiRequestBodyDemo(@MultiRequestBody(“dog”) Dog dog, @MultiRequestBody(“user”) User user)的注解,那么这些注解是Spring MVC自带的吗?当然不是,spring MVC中自带的是@RequestBody的注解,这个注解有什么作用呢?这个注解可以将前端传进来的json数据进行解析成json数据。而如果我们没有采样@MultiRequestBody时,通常的做法是将其首先转成json首原创 2020-05-24 07:59:54 · 3124 阅读 · 0 评论 -
ThreadPoolExecutor源码学习
思考线程池的相关参数含义,以及32位的相关含义,拒绝策略以及运行状态?采用executorService创建线程,可以创建线程:newCahcheThreadPool、newFixedTheadPool、newSingleThreadExecutor、newScheduledThreadPool。但点进去看newSingleThreadExecutor可以看到其会调用ThreadPoolExe...原创 2020-04-16 17:13:47 · 132 阅读 · 0 评论 -
LinkedBlockingQueue源码学习
首先来看一个例子,例子来源于网上:/** * 多线程模拟实现生产者/消费者模型 * */public class BlockingQueueTest2 { /** * * 定义装苹果的篮子 * */ public class Basket { // 篮子,能够容纳3个苹果 BlockingQu...原创 2020-04-16 17:08:34 · 686 阅读 · 2 评论 -
ReentranLock源码学习
首先回答一个问题?线程的三大特性?什么时候我们需要锁?java中已经提供了synchronized,为什么还要使用ReentrantLock?AQS原理。 线程的三大特性:原子性、可见性、有序性。也就是说满足这个三个特性的操作都是可以保证安全的,如Atomic包、volatile、通过happensBefore原则可以进行线程的安全的判断,这个依据通常是为了避免jvm指令重排。比如通...原创 2020-04-16 17:07:16 · 304 阅读 · 0 评论 -
ConcurrentHashMap源码学习
首先思考一下:既然有了HashMap为什么还会出现ConcurrentHashMap?同时ConcurrentHashMap具有什么优势?ConcurrentHashMap与HashMap、HashTable有什么区别?ConcurrentHashMap中的sizeCtl有几种值,这些值代表的是什么状态?ConcurrentHashMap使用了哪些锁?DEFAULT_CONCURRENCY_LE...原创 2020-04-16 17:02:50 · 377 阅读 · 0 评论 -
HashMap源码学习
首先实现map的子类:HashMap、HashTable、TreeMap、LinkedHashMap。这几个类中HashMap与HashTable的区别:线程上:HashMap是线程不安全的,而HashTable是安全的。key、value的支持:HashMap的key、balue可以为空,而HashTable是key、value不可以为空的。底层数据结构:HashMap采用数组+链表+红黑树...原创 2020-04-16 16:58:28 · 120 阅读 · 0 评论 -
LinkedList源码学习
前面一文,我们知道ArrayList是给定初始化容量为10,后面进行扩容时是原来的1.5倍。采用位运算向右移一位+原来的容量。扩容的时候将原来的数组元素拷贝到新的数组中,采用arrayCopy复制到新的数组中。其最大容量是2^31-9。其扩容操作是在grow方法中进行的。LinkedList 继承 抽象SequentialList、实现list接口,双端队列Deque以及克隆,因此具备列表、队列...原创 2020-04-16 16:55:47 · 123 阅读 · 0 评论 -
初识java
1.Java的应用: 互联网:电商、P2P等等; 企业级应用:ERP、CRM、BOS、OA等等2.常用DOS命令 d :回车,盘符切换 dir(directory): 列出当前目录下的文件及文件夹 cd(change directory) :改变指定目录(进入指定目录) cd .. :返回到上一级目录原创 2017-07-19 19:16:48 · 295 阅读 · 0 评论 -
相关API的整理
1.Object获取字节码对象 通常将类中的成员变量、构造方法 、get/set方法给出后,可以通过3种方式获取字节码对象。 例如给出Teacher类、构造方法 、get/set方法给出后:获取 方式1:通过Object类的getClass()方法获取 //实例化对象的方法getClass来获取 Teacher t = new Teacher(); //将Teacher原创 2017-09-16 00:12:58 · 195 阅读 · 0 评论 -
IO文件学习
Filer:文件和目录路径名的抽象形式,Filer类的实例是不可变的。File类的构造函数 File(String pathname) :将一个字符串路径封装成File对象 File(String parent,String child):传入一个父级路径和子级路径 File(File parent,String child):传入一个File类型的父级路径和子级路径原创 2017-09-16 00:14:21 · 176 阅读 · 0 评论 -
集合学习整理
遍历的常用方法:for循环、迭代器、增强for循环、或者采用toArray的方法将其转成字符数组进行遍历 一、下面这些遍历是基于一个键或者值得。1。迭代器的用法:作为一个遍历的方法通常将给定的集合,采用迭代器创建迭代器对象的方法,采用while循环进行判断是否还有下一个元素iter.hasNext(),如果有的话,就可以进行赋值,即iter.next()。其具体形式为:Ite原创 2017-09-16 00:15:51 · 199 阅读 · 0 评论 -
反射学习
1.字节码获取的三种方式: 对象名.getClass(); 类名.class Class.forName("com.itheima.Student"); 2.反射操作构造方法 (1) Constructor c = clazz.getConstructor(String.class,int.class); //获取有参构造 System.o原创 2017-09-16 00:16:32 · 267 阅读 · 0 评论 -
HTML学习整理
1.什么是HTML?Hyper Text Markup Language:超文本标记语言超文本:功能比普通文本更加强大标记语言:使用一组标签对内容进行描述的一门语言2.为什么要学习HTML?3.语法: HTML文件以.html或者.htm结尾的。 HTML文件分为头部分和体部分 HTML标签都是由开始标签和结束标签组成。 HTML标签不区分大小写原创 2017-09-16 00:18:26 · 284 阅读 · 0 评论 -
CSS学习整理
1.表单标签 表单标签 action属性: 请求路径,确定表单提交到服务器的地址 method属性: 请求方式。常用的取值:get、post get:默认值 post:提交数据不再请求路径上追加 2.输入标签 用于获取用户输入信息,type属性值不同,搜集方式不同。最常用的属性 : type属性: tex原创 2017-09-16 00:19:23 · 358 阅读 · 0 评论 -
几种去重算法的实现
几种去重算法的实现 第一种: package Demo1;import java.util.TreeSet;//实现功能:去重 /* 利用Set接口的实现类,实现类不能添加重复元素的特性, * 同时TreeSet实现类中添加元素是按照顺序排列的特点解决查重和排序问题 * * 使用Set接口中三个实现类无法存入相同的元素特性, * 和TreeSet存储顺序为升序存储引用的特性来原创 2017-09-16 00:36:39 · 11576 阅读 · 0 评论 -
对java的入门学习
在Eclipe下依次创建项目item、包Number和类First。在类体中输入以下代码,实现在控制台上输出”你好 java“代码:package Numberpublic class First { static string s1="你好; public static void main (string[ ] args) {原创 2016-11-14 20:59:10 · 377 阅读 · 0 评论