进阶篇
文章平均质量分 51
写代码砌砖头
写代码,改变世界!
展开
-
如何在一次请求中访问多个接口(方法)并获取多个返回值
假如要访问同一个类的不同方法,或者不同类的方法,并且要同时获取返回值。可以JSON格式的参数,以及组装多个结果返回值为JSON格式。例如:package com.river.web.function.smartrequst.serivce.impl;import com.river.web.function.smartrequst.model.User;import com.river.web.function.smartrequst.serivce.UserSerivce;import or原创 2021-01-03 12:46:54 · 4386 阅读 · 5 评论 -
设计模式是一种思维,不是一组规则(2)
在享元模式中,有一个很经典的案例就是Integer包装类的实现。看下如下代码:Integer a = 1;Integer b = 1;System.out.println(a == b);Integer c = 128;Integer d = 128;System.out.println(c == d);这里a == b是true,而c == d是false的结果。因为Integer的源码实现中,使用了共享内存的设计理念(即享元模式),源码如下: private static原创 2020-11-15 17:45:12 · 244 阅读 · 0 评论 -
设计模式是一种思维,不是一组规则(1)
java中具体的23中设计模式的介绍,可以参考:http://c.biancheng.net/design_pattern/里面讲解的挺详细的,但是“专业的”词语用的太多,并不利于我们接触和了解设计模式以及为什么要存在设计模式。如模板方法模式,为什么要存在,解决了编程中的什么问题?举个例子:《中国好声音》舞台中,参赛选手经过层层选拔,最终有人获得冠军。比赛还没有开始时,我们不知道谁参加了比赛,谁在初赛中唱了什么歌,半决赛中唱了什么歌,是否有被淘汰等等。但是选手必须过了初赛,才可以进入半决赛.原创 2020-11-08 09:27:14 · 412 阅读 · 2 评论 -
Optional<T>到底要怎么用?从源码分析下是否真的是用来解决空指针异常的类
错误用法:1、先使用isPresent来判断是否有值,然后使用get()方法取出元素。Optional<String> optional = Optional.empty();if (optional.isPresent()) { String str = optional.get();}public boolean isPresent() { return value != null;}说明:我直接用!Objects.isNull()判断下,再处理它不香原创 2020-10-08 00:00:55 · 689 阅读 · 2 评论 -
java8中函数式接口Function的作用
先看下Function的其中一个应用:1、如果我们需要一个对象集合的某一个属性的集合,例如:获取User对象中的userName属性。/** * @Author river66 * @Date 2020/9/12 8:34 */@Datapublic class User { private String userName; public User(String userName) { this.userName = userName; }}原创 2020-09-12 09:51:24 · 2122 阅读 · 0 评论 -
java8中的函数式接口Consumer的用处(@FunctionalInterface)
先了解下这个单词的意思:Consumer [kənˈsjuːmə(r)] :消费者既然是消费者,那么它消费的是什么呢?先说结论:消费的是函数(或是代码段),封装的是逻辑代码。先看看,如果我们要遍历一个List集合,一般我们会这么写:List<String> list = new ArrayList<>();list.add("aa");list.add("bb");for (String s : list) { System.out.println(s).原创 2020-08-23 08:55:44 · 1945 阅读 · 0 评论 -
java8中的函数式接口Predicate的用处(@FunctionalInterface)
先了解下这个单词的意思:Predicate[predɪkeɪt]:使以…为依据;断言意思和if 差不多,if (condition) {...},以condition为依据,然后就执行{}的语句。看下这里例子:如果要判断一个集合中是否包含某个元素,通常我们会使用foreach配合if 条件判断,如下: private static <T> boolean hasOne(Collection<T> collection, T t) { ...原创 2020-06-29 21:29:33 · 4727 阅读 · 0 评论 -
搭建一个高性能、高并发的服务程序(Netty)
什么是Netty?Netty是一款受大公司青睐的java开源网络编程框架,用以快速开发高性能、高可靠性的网络服务程序。为什么不叫Http服务程序?Netty可以通过编程自定义各种协议,当然也可以作为Http服务。BIO和NIO分别是什么意思?BIO(Blocking I/O),阻塞IO,资源不可用时,IO请求一直阻塞,阻塞导致处理网络I/O时,一个线程只能处理一个网络连接。...原创 2020-02-03 18:14:34 · 629 阅读 · 0 评论 -
Redis分布式锁的使用
为什么要用到分布式锁?在分布式系统中,不同的系统需要使用到同一个资源的时候,需要对这个资源进行加锁,使得在某一时刻只有一个系统操作资源,以此来保证数据的一致性。两个原子方法setnx():不存在时设置值返回true,存在则不进行设置并返回false(对应java的setIfAbsent()方法)getset():设置新值并返回旧值。可以访问Redis中文网站查看具体的介绍:h...原创 2020-01-17 13:00:12 · 255 阅读 · 0 评论 -
spring mvc的处理流程
一、在web.xml中配置DispatcherServlet(实现了Servlet接口)的相关信息,其中包括: 1、初始化参数init-param的name、value(contextConfigLocation: 配置文件的路径) 2、Servlet处理的请求映射url (servlet-mapping)二、在DispatcherServlet的初始化方法i...原创 2019-12-25 09:40:15 · 157 阅读 · 0 评论 -
关于java动态代理源码的探索
本博客阅读的前提:了解Class对象,可以参考:https://blog.csdn.net/river66/article/details/103606336java实现动态代理利用的是java的反射机制,我们会使用Proxy.newProxyInstance()生成代理类。如:public interface Movable { void move();}public c...原创 2019-12-22 22:44:04 · 153 阅读 · 0 评论 -
java中最特殊的对象——Class对象
什么是Class对象?Class对象描述类的信息,对应着java.lang.Class类。类是对象的抽象,而Class类是对类信息的抽象。为什么需要Class对象?1、当程序在运行时需要识别对象和类的信息时,就会需要用到Class对象中的信息。即RTTI(Run-Time Type Identification)运行时类型识别 ,是依赖Class对象来完成功能。java语言的多...原创 2019-12-19 12:14:37 · 414 阅读 · 0 评论 -
根据java文档全面解析Thread.yield()方法
/**(1) * A hint to the scheduler that the current thread is willing to yield * its current use of a processor. The scheduler is free to ignore this * hint. *(2) * <p&g...原创 2019-06-12 16:47:40 · 896 阅读 · 0 评论 -
由.java和.c文件生成.so文件的艰苦路程
一、.java生成.class文件可以有两种方式:1、直接使用javac 类名(进入到类所在目录)注意:如果提示'javac' 不是内部或外部命令,也不是可运行的程序的话,需要在环境变量里面的用户变量(不是系统变量哦)中的Path变量,新增%JAVA_HOME%\bin;2、新增了JNI类以后,rebuild project,这样.class文件会在项目的\app\build\...原创 2019-06-11 17:11:43 · 920 阅读 · 0 评论 -
为什么使用线程池而不使用new Thread(runnable).start();
1、每次new Thread,新建对象性能差2、缺乏统一管理,可能导致线程创建过多,死机等。3、缺乏更多功能,如:定时执行,定期执行,线程中断等。tips:养成良好习惯,从线程池开始!4种线程池:Java通过Executors提供四种线程池,分别为:1、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需求,可以灵活回收空闲线程,若无可回收则新建线...原创 2019-02-19 10:36:54 · 18228 阅读 · 2 评论 -
创建有返回值的线程(Callable+FutureTask)
代码如下:String callableReturnValue = null;Callable<String> callable = new Callable<String>() { @Override public String call() throws Exception { Thread.sleep(1000); ...原创 2019-02-19 11:21:26 · 409 阅读 · 0 评论 -
java开发——Apache Mina的使用
Apache Mina是一个NIO库,实现非阻塞式通讯。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。使用步骤:1、配置Maven2、配置spring3、实现编码工厂ProtocolCodecFactory 4、继承编码器适配器ProtocolEncoderAdapter 5、实现解码器ProtocolDecoder ...原创 2019-02-19 17:10:08 · 2934 阅读 · 0 评论 -
java开发——线程同步锁synchronized是如何造成死锁的?
结论:使用同步锁的同步代码块中调用了外来方法,此外来方法也使用到了相同的同步锁,相互等待造成死锁。例程代码如下:ObservableSet<Integer> set = new ObservableSet<Integer>( new HashSet<Integer>()); //addObserver这一步需要List对象obser...原创 2019-03-08 11:49:21 · 941 阅读 · 0 评论 -
java开发——为什么要使用动态代理?
举个例子:假如有一个杀手专杀男的,不杀女的。代码如下:public interface Killer { void kill(String name, String sex); void watch(String name);}public class ManKiller implements Killer { @Override public voi...原创 2019-03-26 15:50:52 · 967 阅读 · 3 评论 -
android开发——异步消息的处理(灵活的使用EventBus)
不知道EventBus如何使用的,可以看下这边博客:https://blog.csdn.net/river66/article/details/86571860发送异步消息:EventBus.getDefault().post(new AsyncMessage(200, "成功").setData(new Object()).sendTo("MainActivity"));接收异步消...原创 2019-04-23 10:45:10 · 455 阅读 · 0 评论 -
轻松看懂synchronized和wait()、notify()、notifyAll()的关系
synchronized:同步的意思,可以分为对象同步、类同步。wait()、notify()、notifyAll():等待与唤醒;等待的是锁,唤醒的是线程,目的是为了实现数据的同步。类同步:public staticsynchronized void method(){...}或者synchronized(类名){...},其中{}里面的代码块拥有类锁。对象同步:public sy...原创 2019-05-31 17:16:50 · 1381 阅读 · 0 评论 -
源码解析Thread.join()方法的实现原理
直接上源码:join()方法的调用的例子,可以看我的上一篇博客:https://blog.csdn.net/river66/article/details/91492758wait()方法的使用,可以看我的另一篇博客:https://blog.csdn.net/river66/article/details/90718182private final Object lock = n...原创 2019-06-13 13:31:06 · 787 阅读 · 0 评论 -
volatile与java内存模型的那点关系
有一半(1/3+1/6)的关系!因为java内存模型的三个特性,volatile满足了两个!1、可见性(满足)2、有序性(满足了一半)3、原子性(不满足)下面解释下:可见性:多个线程使用到同一个变量时,一旦有一个线程修改了变量,其他线程再读取时一定是读取到这个修改后的值。有序性:程序执行的顺序按照代码的先后顺序执行。不会发生指令重排序,或者指令重排序在多线程环境下显现出...原创 2019-06-06 18:12:55 · 190 阅读 · 0 评论 -
可重入锁ReentrantLock和可重入读写锁ReentrantReadWriteLock
ReentrantLock和synchronized都是可重入锁,可重入锁的意思是:拥有锁的代码块中可以继续去获取锁。 public synchronized void out(){//锁的是this对象,但是看不到锁 //doSomething in(); } public synchronized void in(){ ...转载 2019-06-14 10:35:53 · 275 阅读 · 0 评论 -
android开发——不会被异常打断的线程休眠SystemClock.sleep()
源码如下:public static void sleep(long ms){ long start = uptimeMillis(); long duration = ms; boolean interrupted = false; do { try { Thread.sleep(duration); ...原创 2019-02-18 15:25:03 · 924 阅读 · 0 评论