自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

天道酬勤

一直在路上

  • 博客(63)
  • 收藏
  • 关注

原创 多线程-深入洞察 ReentrantLock

一、获取锁 二、释放锁 三、小结工程源码来自:JDK 1.8ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率。API介绍如下:一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访...

2019-04-30 10:38:57 82

原创 java并行处理的演变过程

1.单线程2.多线程3.线程池4.foke/join5.流处理这样的一个演变过程提高了cpu的利用率和执行速度谈到并行,我们可能最先想到的是线程,多个线程一起运行,来提高我们系统的整体处理速度;为什么使用多个线程就能提高处理速度,因为现在计算机普遍都是多核处理器,我们需要充分利用cpu资源;如果站的更高一点来看,我们每台机器都可以是一个处理节点,多台机器并行处理;并行的处理...

2019-04-29 16:25:06 274

原创 多线程-解决死锁问题

下面是一个多线程死锁的例子1.死锁死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。Java 死锁产生的四个必要条件:1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。3、请求和保持,即当资源...

2019-04-29 14:21:22 1043

原创 多线程-Semaphore(其实就是一把锁)

/** * 所谓的信号量,其实就是一个控制线程的数目的构造 */public class SemaphoreDemo { //用static 和final 这样就表明属于类级别的,既然是类级别的,那么可以认为是单例模式的 //也就是最大的并发访问量是3个,即同一时间 //构造参数: /** * 1.默认是非公平的,因为里面包含的是一个队列,要实现公...

2019-04-28 10:32:29 779

原创 java基础-代码块

1.普通代码块: 方法中的代码体.{},2.静态代码块:类级别的,优先于主方法执行static{}3.构造代码块:对象级别的.{}4.同步代码块具体的实例,下面有代码说明在java中用{}括起来的称为代码块,代码块可分为以下四种:一.简介1.普通代码块:类中方法的方法体2.构造代码块:构造块会在创建对象时被调用,每次创...

2019-04-26 14:27:45 111

原创 多线程-volatile关键字应用场景

volatile可以看成是synchronized的一种轻量级的实现,但volatile并不能完全代替synchronized,volatile有synchronized可见性的特性,但没有synchronized原子性的特性。可见性即用volatile关键字修饰的成员变量表明该变量不存在工作线程的副本,线程每次直接都从主内存中读取,每次读取的都是最新的值,这也就保证了变量对其他线程的可见性。另外...

2019-04-26 14:13:41 223

原创 关于Spring中的上下文的应用-ApplicationContext

@Componentpublic class SpringUtils implements ApplicationContextAware { private static ApplicationContext applicationContext; /** * @return * @Description 获取applicationContext ...

2019-04-26 13:57:56 395

原创 设计模式-单例模式实现机制

单例,大家肯定都不陌生,这是Java中很重要的一个设计模式。稍微了解一点单例的朋友也都知道实现单例是要考虑并发问题的,一般情况下,我们都会使用synchronized来保证线程安全。那么,如果有这样一道面试题:不使用synchronized和lock,如何实现一个线程安全的单例?你该如何回答?C类应聘者:可以使用饿汉模式实现单例。如:还有部分程序员可以想到饿汉的变...

2019-04-25 14:55:27 568

原创 java异步并发编程-CompletableFuture

CompletableFuture 是 JDK1.8 新增的工具类。它继承了 Future 和 CompletionStage 接口,里面提供了大量的链式调用的 API。下面简单的介绍一下其用法:异步执行任务CompletableFuture 对接口的封装,使得调用者很容易实现Future模式的异步调用。如下Demo:public class CalcTest { public...

2019-04-25 13:45:36 282

原创 java异步编程-Future 模式

Future 模式是一种让调用线程可以异步处理任务的设计模式,它可以让调用线程利用异步处理的时间去执行其他任务,从而使硬件资源达到一个更好的利用率。参考以下时序图:下面介绍一下各个成员的作用:MainTest:主线程入口,调用Client发出请求。 Client:开启异步线程,并提交任务,返回FutureData。 FutureData:同步返回的对象,对RealData做了...

2019-04-25 13:44:14 902

原创 static关键字和@Value注解不兼容的解决

即:1.如果一个成员变量被static关键字修饰,并且要通过@Value注解从配置文件读取这个变量的值,那么如果直接在其上加注解读取是不可以的,只能通过set方法进行读取,并且set方法一定不是静态的,因为@Value注解一旦遇到static关键字这个值就是识别不来,就是不兼容的.其余的可以直接通过读取;2.静态方法里面的变量都是静态的,说法正确吗? 其实并不争取,只能说静态方法只...

2019-04-23 17:38:39 2434

原创 ArrayList为什么是线程不安全的?

对于ArrayList,相信大家并不陌生。这个类是我们平时接触得最多的一个列表集合类。面试时相信面试官首先就会问到关于它的知识。一个经常被问到的问题就是:ArrayList是否是线程安全的?答案当然很简单,无论是背来的还是自己看过源码,我们都知道它是线程不安全的。那么它为什么是线程不安全的呢?它线程不安全的具体体现又是怎样的呢?我们从源码的角度来看下。二.源码分析首先看看这个类所拥...

2019-04-23 10:02:22 372

原创 反射(二)-获取类中的构造函数

我们可以使用Class类中的Constuctor<?>[] getConstructors()方法,来获得这个类的构造函数。JDK API文档里,对这个方法的描述如下:返回一个包含某些Constructor对象的数组,这些对象反映此Class对象所表示的类的所有公共构造方法。如果该类没有公共构造方法,或者该类是一个数组类,或者该类反映一个基本类型或 void,则返回一...

2019-04-23 07:39:06 491

原创 反射(一)-通过Class实例化任意类的对象

package com.weigu.xiaochuang.reflection;/** * 显式声明空的构造函数有时候也是一种很好的习惯。当你要使用反射时,一定不要忘记空的构造。 * 一个对象在new之前,堆里是不会分配内存的。因此这个UserInfo的实例是通过Class的实例得到的 */public class UserInfo { private int userId;...

2019-04-23 07:31:18 800

原创 java8-接口中的默认方法和静态方法

JAVA8已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本。其中包括语言、编译器、库、工具和JVM等诸多方面的新特性。Java8 新特性列表如下:接口默认方法 函数式接口 Lambda 表达式 方法引用 Stream Optional 类 Date API Base64 重复注解与类型注解 一、接口默认方法 1、什么是接口默认方...

2019-04-22 14:58:36 519

原创 获取某个接口的所有实现类并且初始化

日前项目中遇到一个问题: 有一个接口,这个接口定义了一种规范和标志,接口中只有一个初始化方法,接口的实现类可能会有非常多,需要在容器启动过程中我们去手动初始化这个接口的所有实现类,虽然在spring中我们可以直接配置,但是维护与使用时却不够优雅。1. 以一个Config接口为例:Java代码publicinterfaceConfig{...

2019-04-22 14:36:32 1867

原创 多线程-理解

/** * 1.如何同时启动两个线程 * 程序的启动就是两个线程的同时启动 * 2.让同时启动的线程如何按照一定的顺序执行 * 两个线程按照一定的顺序执行:说明的是满足某个条件的运行即:多线程协调之间的通信这样用到的通信的工具类就是有 * countDownLatch,cycBarier,Condition,ReenTLock等等的操作 * 我们经常说线程安全性,与其说是线程安全性不...

2019-04-22 11:16:25 148

原创 SpringCloud -Hystrix

在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫...

2019-04-21 17:50:24 113

原创 SpringCloud-Feign

一、Feign简介Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。简而言之:Feign 采用的是基于接口的注解Feign 整合了...

2019-04-21 17:45:43 183

原创 动态代理

实际的应用场景:动态代理的实现方式有两种: 1.cgLib 2.jdk1.8动态代理应用场景: aop 底层是通过动态代理实现,并且应用到了反射的原理,(关于反射以后会用得到的,以后会讲解)说了这么多,其实作为程序员,最重要的是代码直接上,通过代码直接的去体现这个问题是很直观的,理论结合实践,这样可以做到很深刻的理解和应用;package com.wei...

2019-04-21 17:42:55 103

原创 静态代理的理解

package com.weigu.xiaochuang.proxy;/** * 接口是一个抽象的概念,所谓的抽象的概念就是很多的类或者对象都具有这样的一个特征,这样的话 * 其实就是解决了代码冗余的问题,这也就是为什么会有接口的原因;,提高了代码的可用性 * 代理:代理真实对象去办理,从而实现一些附加功能; */public class LandlordImpl implemen...

2019-04-20 17:17:03 232

原创 分布式-保证分布式系统数据一致性的6种方案

问题的起源在电商等业务中,系统一般由多个独立的服务组成,如何解决分布式调用时候数据的一致性?具体业务场景如下,比如一个业务操作,如果同时调用服务 A、B、C,需要满足要么同时成功;要么同时失败。A、B、C 可能是多个不同部门开发、部署在不同服务器上的远程服务。在分布式系统来说,如果不想牺牲一致性,CAP 理论告诉我们只能放弃可用性,这显然不能接受。为了便于讨论问题,先简单介绍下数据一致...

2019-04-19 14:34:47 355

原创 多线程-让线程按顺序执行

/** * 同时启动三个线程,然后让这个三个线程有顺序的执行 */public class MyTest { static class MyTask { private static ReentrantLock r1 = new ReentrantLock(); private static Condition conditionA = r1.ne...

2019-04-19 13:43:47 566

原创 多线程-线程池执行多线程,如何保证线程执行完成后再执行下面的业务逻辑

public static void main(String[] args) throws ExecutionException, InterruptedException {ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(3, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingDeque&...

2019-04-19 13:42:39 4452

原创 多线程-Future+Callable实现并发查询

对于所查询的数据比较耗时,数据位于不同的数据源中,可以通过并发查询的方式加快获取想要的数据。记录项目中用到的方法。package com.lancy.interfaces.util;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concur...

2019-04-18 15:45:21 983

原创 多线程-线程池执行多业务逻辑

/** * 1.线程池执行不同的业务逻辑. * 2.获取每个任务执行的结果 * 3.最后的结果会用到之前的结果 */public class SearchUserListDTO { public static void main(String[] args) throws InterruptedException { ExecutorService execut...

2019-04-18 15:43:27 1809

原创 多线程-java中等待一些线程执行完之后,再去执行别的方法(后者需要使用前者返回的结果)

Java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用户下单成功。我们通过以下的几种方法来解决:一、用sleep方法,让主线程睡眠一段时间,当然这个睡眠时间是主观的时间,是我们自己定的,这个方法不推荐,但是在这里还是写一下,毕竟是解决方法二、使...

2019-04-18 15:08:00 7057

原创 多线程-批量获取多条线程的执行结果

当向线程池提交callable任务后,我们可能需要一次性获取所有返回结果,有三种处理方法。方法一:自己维护返回结果// 创建一个线程池ExecutorService executorService = Executors.newFixedThreadPool(10);// 存储执行结果的ListList<Future<String>> results = ...

2019-04-18 14:53:11 3945 8

原创 多线程-使用多线程让多业务查询接口时间成倍减少

场景:查询接口、包括多个独立的业务逻辑查询数据、最后数据统一组装普通的写法:controller类的方法service类的方法controller执行结果:下面使用多线程技术进行优化controller类的方法不变在service类中使用多线程进行优化controller执行结果:通过多线程执行之后,效果提升的比较明显...

2019-04-18 13:54:03 568

原创 java使用多线程及分页查询数据量很大的数据

主要的思路就是:先通过count查出结果集的总条数,设置每个线程分页查询的条数,通过总条数和单次条数得到线程数量,通过改变limit的下标实现分批查询。调用方法:import org.springframework.beans.factory.annotation.Autowired;import java.util.ArrayList;import java.util....

2019-04-18 11:08:42 2242 2

原创 SpringCloud-zuul

1.参数拦截2.参数响应3.限流处理4.跨域处理5.对Bean注解的加载时机的理解以及对this关键字的理解(当前类中不用创建对象,直接用this.方法直接就可以调用)具体的逻辑如下目前我们项目的架构图:从上图中可以看到,Zuul是我们整个系统的入口。当我们有参数校验的需求时,我们就可以利用Zuul的Pre过滤器,进行参数的校验。例如我现在希望请求都一律带上token...

2019-04-17 11:20:25 108

原创 java8-list TO map

1.属性-->对象2.属性-->属性3.属性--->集合关联到的api: 1.java8关于集合非空的判断 2.重复key 的问题的处理 3.@postConstrutor相当于static静态代码块 4.java8中的两个Stream()方法和collect()方法是很重要的说了这么多,最直接的就是上代码,这样问题是最直观...

2019-04-15 15:13:22 1922

原创 git-常见实用命令

1.将本地代码推送到新建的git服务器上: git init --初始化仓库 git add . --添加代码到本地缓存区 git commit -m "",提交本地代码到stash git remote add origin [git path] --推送到git 服务器如果Git服务器已经存在,报错:可以: git remote rm ori...

2019-04-10 17:40:37 89

原创 git-上传项目到仓库

https://www.cnblogs.com/eedc/p/6168430.html

2019-04-10 13:25:12 669

原创 mysql-分页查询的两种思路

//记录之前的最大id,传过来select * from orders_history where id >= 1000001 limit 100;SELECT*FROMproductWHEREID>=(selectidfromproductlimit866613,1)limit20SELECT*FROMproductaJOIN(se...

2019-04-10 10:24:55 214

原创 java8-Collectors类下的方法

提到Group By,首先想到的往往是sql中的group by操作,对搜索结果进行分组。其实Java8 Streams API中的Collector也支持流中的数据进行分组和分区操作,本片文章讲简单介绍一下,如何使用groupingBy 和 partitioningBy来对流中的元素进行分组和分区。groupingBy首先看一下Java8之前如果想对一个List做分组操作,我们需要如下代码...

2019-04-09 21:28:42 1604

原创 mysql-幂等性的解决方案-乐观锁

幂等含义我们先了解一下什么叫幂等?在分布式应用中,幂等是非常重要的,也就是相同条件下对一个业务的操作,不管操作多少次,结果都是一样。由来背景为什么要有幂等这种场景?因为在大的系统中,都是分布式部署,如:订单业务 和 库存业务有可能都是独立部署的,都是单独的服务。用户下订单,会调用到订单服务和库存服务。因为分布式部署,很有可能在调用库存服务时,因为网络等原因,订单服务调用失...

2019-04-09 20:27:19 6966

原创 mysql-读写分离,导致数据不一致问题

在互联网中大型项目中,读写分离应该是我们小伙伴经常听说的,这个主要解决大流量请求时,提高系统的吞吐量。因为绝大部分互联网产品都是读多写少,大部分都是读请求,很小部分是写请求。上图:1)一个主库负责写请求,更新数据2)两个从库负责读请求,可以提高系统吞吐量3)主库和从库之间同步数据为什么产生数据不一致上图中业务流程1)写请求A进行数据更新,但写库...

2019-04-09 19:32:53 5158 2

原创 mysql-分库分表方案

垂直拆分比较简单,也就是本来一个数据库,数据量大之后,从业务角度进行拆分多个库。如下图,独立的拆分出订单库 和 用户库。水平拆分的概念,是同一个业务数据量大之后,进行水平拆分。上图中订单数据达到了4000万,我们也知道mysql单表存储量推荐是百万级,如果不进行处理,mysql单表数据太大,会导致性能变慢。使用方案可以参考数据进行水平拆分。把4000万数据拆分4张表或者...

2019-04-09 19:31:38 1512 1

原创 java8-stream(list集合的去重)

public static void main(String[] args) { List<UserInfo> list = new ArrayList<>(); list.add(new UserInfo(1, "111")); list.add(new UserInfo(1, "111"));// HashS...

2019-04-09 11:00:53 6983

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除