自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

绅士jiejie的博客

复利是世界第八大奇迹!!!

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

原创 什么样的分布式系统可以称为微服务架构?

每个服务都是由多个独立的进程组成的,这些进程可以部署在不同的物理机上,这样除非所有物理机都宕机,否则总能保证至少有一个进程能对外提供该服务。系统不再是一个巨大的单体系统,而是有多个微服务有机组成,统一对外提供服务的分布式系统。...

2020-07-31 12:11:20 300

原创 进程一定要分布在不同主机上,才能叫做分布式系统么?

不管多个进程是不是部署在同一台机器上,只要这多个独立的进程逻辑上组成一个系统,一起对外提供服务,就能叫做分布式系统。

2020-07-30 20:57:33 406

原创 简单了解一下Cglib动态代理

相比起Java SDK动态代理只能够对接口进行代理,同时返回的代理对象也只能转换到某个接口类型,Cglib动态代理能够做到直接代理类。Cglib动态代理demo代码:import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;import java

2020-07-29 12:16:25 263

原创 五十九.修改SPU规格

AttrController添加如下接口: @PostMapping("/update/{spuId}") public R updateSpuAttr(@PathVariable("spuId") Long spuId, @RequestBody List<ProductAttrValueEntity> entities) { productAttrValueService.updateSpuAttr(spu

2020-07-29 00:39:33 307

原创 五十八.查询SPU规格

AttrController类添加如下接口: @GetMapping("/base/listforspu/{spuId}") public R baseAttrlistforspu(@PathVariable("spuId") Long spuId) { List<ProductAttrValueEntity> entities = productAttrValueService.baseAttrlistforspu(spuId); retur

2020-07-29 00:28:09 340

原创 五十七.采购完成功能代码编写

先准备完成采购功能所需的几个参数实体,如下:PurchaseDoneQo:import lombok.Data;import javax.validation.constraints.NotNull;import java.util.List;@Datapublic class PurchaseDoneQo { @NotNull private Long id;//采购单id private List<PurchaseItemDoneQo> items;}

2020-07-28 23:03:52 458

原创 五十六.领取采购单功能编写

PurchaseController类添加相关接口,如下: /** * 领取采购单 * * @return */ @PostMapping("/received") public R received(@RequestBody List<Long> ids) { purchaseService.received(ids); return R.ok(); }PurchaseService类添加

2020-07-28 22:29:50 205

原创 Java SDK动态代理类怎么调用到invoke()方法?

Java SDK动态代理的demo代码:import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class JDKDynamicProxyDemo { static interface Iservice { void sayHello(); } static class Service i

2020-07-28 21:39:23 1247 4

原创 碰到key有重复的map怎么处理

如果key没有重复,那么map的key-value大概是属于一对一的结构,如果key有重复,但是如果这是因为业务数据造成的重复,说明可能key-value就应该是一对多的关系,那么可以参考如下的示例代码:/** * 一个简单的把用户集合转换成(名称-用户)的map,所以用户可能有多个 * * @param userInfoList * @return */public Map<String, List<UserInfo>> getMap(List<UserInfo

2020-07-28 20:35:46 3707

原创 Java SDK动态代理

动态代理分为Java SDK 动态代理以及cglib动态代理,这里先了解下Java SDK动态代理Java SDK动态代理代码demo:import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class JDKDynamicProxyDemo { static interface Iservice { .

2020-07-28 12:10:09 411

原创 了解静态代理

首先需要的了解下代理,用一个生活中的例子来做类比—代购。客户原来是直接向厂家购买商品,但是有了代购商后,客户不再直接与厂家打交道,而是通过代购商来间接和厂家交流,这个代购商就是代理。如果用代码的逻辑思想去理解的话,可以想象原来客户类是直接调用委托类接口,而现在多了代理,多了个中间层,二者之间通过代理中间层交流,客户类不知道委托类具体的实现逻辑,而委托类也实现了与客户类之间的解耦,委托类可以在客户类需要的情况下,不修改自己的代码,完成一些额外的逻辑处理。代理分为静态代理与动态代理,这里先了解下静态代理

2020-07-27 22:14:22 172 1

原创 为什么ForkJoinPool可以创建出类型为ForkJoinWorkerThread的线程?

直接看下ForkJoinPool的无参构造方法,如下:ForkJoinPool forkJoinPool = new ForkJoinPool();跟进构造方法源码中,如下:public static final ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory;public ForkJoinPool() { this(Math.min(MAX_CAP, Runtime.getRuntime().ava

2020-07-27 12:17:04 728

原创 ForkJoinPool的fork()方法做了什么事?

先看看fork()方法的源码,如下:public final ForkJoinTask<V> fork() { //定义一个线程实例属性t Thread t; //取得当前线程实例赋值给t,然后判断该线程是否是ForkJoinWorkerThread类型 if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) //如果是,则把该任务加入到当前线程的工作队列中

2020-07-27 12:12:32 545

原创 五十五.合并采购需求功能编写

以下接口和代码完成两项功能:查询未领取的采购单合并采购创建qo文件夹以及合并采购请求参数类MergeQo,如下:MergeQo:import lombok.Data;import java.util.List;@Datapublic class MergeQo { private Long purchaseId; //整单id private List<Long> items;//[1,2,3,4] //合并项集合}在webshop-common项

2020-07-26 23:49:33 379

原创 五十四.采购需求列表功能完善

由于代码生成器已经生成了相应的采购需求列表接口,如下:所以直接修改其调用接口的实现类PurchaseDetailServiceImpl对应方法的逻辑,加上筛选条件即可,如下: @Override public PageUtils queryPage(Map<String, Object> params) { QueryWrapper<PurchaseDetailEntity> queryWrapper = new QueryWrapper<Purc

2020-07-26 23:08:09 253

原创 五十三.查询库存列表功能完善

由于代码生成器已经生成了相应的查询库存列表接口,如下:所以直接修改其调用接口的实现类WareSkuServiceImpl对应方法的逻辑,加上筛选条件即可,如下: @Override public PageUtils queryPage(Map<String, Object> params) { QueryWrapper<WareSkuEntity> queryWrapper = new QueryWrapper<>(); S

2020-07-26 22:57:10 754

原创 五十二.编写库存服务的获取仓库列表功能

由于在一开始时,就把库存服务webshop-ware配置类注册中心的地址,此时只需要在网关webshop-gateway服务添加上相应的路由即可,如下: - id: ware_route uri: lb://webshop-ware predicates: - Path=/api/ware/** filters: - RewritePath=/api/(?<segment>

2020-07-26 22:44:49 256

原创 Spring boot-全局配置日期转换

通过以下注解实现全局的日期转换格式,方便前端展示,同时省去在每一个字段上加注解的工作量,配置如下:spring: jackson: date-format: yyyy-MM-dd HH:mm:ss

2020-07-26 22:30:36 353

原创 五十一.商品管理-SKU检索功能

由于代码生成器有生成相应的sku查询列表接口,如下:接口路径不变,修改该接口所调用的service层方法,加上相应查询参数,在SkuInfoService接口添加允许有筛选条件的方法,如下: /** * 根据条件筛选列表 * * @param params * @return */ PageUtils queryPageByCondition(Map<String, Object> params);在SkuInfoServ

2020-07-26 22:22:30 850

原创 五十.商品管理-SPU检索功能

由于代码生成器有生成相应的spu查询列表,如下:接口路径不变,修改该接口所调用的service层方法,加上相应查询参数,在SpuInfoService接口添加允许有筛选条件的方法,如下: /** * 根据条件筛选列表 * @param params * @return */ PageUtils queryPageByCondition(Map<String, Object> params);在SpuInfoServiceImpl类中

2020-07-26 22:07:10 685

原创 抽象了解下ForkJoinTask的拆分思想

demo代码如下:import java.util.concurrent.ForkJoinPool;import java.util.concurrent.ForkJoinTask;import java.util.concurrent.RecursiveTask;import java.util.concurrent.atomic.AtomicInteger;public class TestForkJoinPool { static class ForkJoinSumCalculat

2020-07-25 21:46:39 278

原创 使用finalize()方法让对象进行自救

demo代码:import java.util.concurrent.TimeUnit;public class ObjectHelpSelf { private static ObjectHelpSelf objectHelpSelf = null; @Override protected void finalize() throws Throwable { System.out.println("进入finalize方法中,对象开始自救");

2020-07-24 21:45:31 476

原创 JMM中的工作内存和主内存对应着JVM运行时数据区的哪些部分

工作内存是私有区域,所以工作内存可以对应着JVM运行时数据区的线程私有部分,包括虚拟机栈,本地方法栈,程序计数器。主内存是共享区域,所以主内存可以对应着JVM运行时数据区的线程共享部分,包括堆和方法区。...

2020-07-24 19:21:50 670

原创 如何让子线程获取到父线程的ThreadLocal中的值

代码demo如下:public static void main(String[] args) throws InterruptedException { Thread parentParent = new Thread(new Runnable() { @Override public void run() { ThreadLocal threadLocal = new ThreadLocal(); threadLo

2020-07-24 12:40:52 2579

原创 使用线程组统一处理异常

使用线程组统一处理异常代码demo:public static void main(String[] args) { ThreadGroup threadGroup = new ThreadGroup("线程组一") { @Override public void uncaughtException(Thread t, Throwable e) { System.out.println(t.getName() + e.getMessage()

2020-07-24 12:10:59 217

原创 为什么说Java8的Stream并行流底层使用了Fork/Join框架

先写一个Java8Stream并行流的demo,如下:import java.util.stream.Stream;public class AtomicIntegerArrayTest { public static void main(String[] args) { Stream.of(1, 2, 3, 4, 5).parallel().reduce((a, b) -> { return a + b; }).ifPresent

2020-07-23 22:53:13 974 2

原创 多进程也可以实现并发,为什么还要使用多线程?

一般使用多进程或者多线程都会涉及到共享资源,那么多进程或者多线程之间就要进行通信,保证数据的安全和准确,而进程间的通信要比线程间的通信复杂许多。进程是重量级的,而线程是轻量级的,因此多线程方式的系统开销会小很多。...

2020-07-23 12:11:22 1022

原创 线程上下文切换的上下文指的是什么?

某一时间点CPU寄存器和程序计数器的内容,被称为上下文。寄存器是CPU内部的少量速度很快的闪存。程序计数器是一个专用的寄存器,被用来表示指令序列中CPU正在执行的位置。

2020-07-23 12:10:48 1997

原创 四十九.完善新增商品接口

SpuInfoController类添加如下接口: /** * 保存 */ @RequestMapping("/save") //@RequiresPermissions("product:spuinfo:save") public R save(@RequestBody SpuSaveQo qo) { spuInfoService.saveSpuInfo(qo); return R.ok(); }SpuInfo

2020-07-22 23:22:22 272

原创 四十八.准备新增商品接口所需的远程服务接口

由于新增商品接口逻辑流程需要远程与优惠券服务通信,所以优惠券需提供以下功能的接口。在webshop-prodect服务中先新建feign包,创建CouponFeignService类用于封装对优惠券服务的远程调用方法,如下:在CouponFeignService类中通过@FeignClient注解指定需要访问的服务名,如下:@FeignClient("webshop-coupon")public interface CouponFeignService {}在webshop-prodect服

2020-07-22 23:07:11 247

原创 四十七.完善新增商品接口所需的本地方法

需要保存spu基本信息SpuInfoServiceImpl接口新增如下方法: /** * 保存基础的商品信息 * * @param infoEntity */ private void saveBaseSpuInfo(SpuInfoEntity infoEntity) { this.baseMapper.insert(infoEntity); } 需要保存Spu的描述图片SpuInfoDescService接口新增如.

2020-07-22 22:36:22 223

原创 四十六.新增商品接口请求参数准备

在webshop-prodect项目的qo文件夹下新建如下几个类,这几个类对应着新增商品接口中的各个对象,如下:Attr:import lombok.Data;@Datapublic class Attr { private Long attrId; private String attrName; private String attrValue;}BaseAttrs:import lombok.Data;@Datapublic class BaseA

2020-07-22 22:16:40 440

原创 Oracle计算两个日期的月份

使用months_between(结束日期,起始日期),结束日期减去起始日期的值就是月份差,会有小数的情况。

2020-07-22 20:58:33 1796

原创 内部锁的使用一定会导致上下文的切换?

如果一个线程申请一个锁时,该锁正被另一个线程所持有,那么这个线程可以进入等待状态,等待持有锁的线程释放锁,然后再去和其他线程一起竞争锁,不过这样的方法会导致线程的上下文切换,或者该线程采用忙等的方法,无限循环空操作,直到所需的条件达成,CAS就是这思想的具体实现,所以内部锁的使用不一定会导致线程的上下文切换,同时Java虚拟机也加入了适应性锁的方案,在JIT编译器的帮助下,对于一个具体的锁实例,Java虚拟机会根据其运行过程中收集到的信息来判断这个锁被线程持有的时间是长还是短,如果是锁被持有时间长的话,Ja

2020-07-22 12:11:52 459

原创 使用RecursiveTask执行多个任务

代码demo:import java.util.concurrent.*;public class ForkJoinDemo { static class RecursiveTaskA extends RecursiveTask<String> { @Override protected String compute() { try { System.out.println(Thread.cur

2020-07-21 22:03:47 598

原创 Java虚拟机对内部锁的优化

从Java6/Java7开始,Java虚拟机对内部锁的实现做了一些优化,包括锁消除,锁粗化,偏向锁及适应性锁。不过这些优化仅在Java虚拟机server模式下起作用,所以在做运行Java程序时,我们需要在命令行中指定Java虚拟机参数”-server”来开启这些优化。可以通过命令行 java-version来查看本机的虚拟机模式,如下:可以发现本机Java虚拟机默认是在server模式下运行的。...

2020-07-21 22:02:05 191

原创 有了锁消除后,就能随意的使用锁了么?

锁消除是JIT编译器对内部锁具体实现所做的一种优化手段, JIT编译器会借助逃逸分析来判断同步块中所使用的锁对象是否只能够被一个线程访问,如果确实没有其他线程能够访问到这个锁对象,那么JIT编译器在编译这个同步块时就不会生成synchronized关键字所对应的字节码指令,不过这不意味着开发可以随意的在不需要加锁的情况下加锁,因为锁消除是由JIT编译器做的优化,而不是javac,而一段代码只有被执行的频率足够大时,才可能被JIT编译器优化,所以可以这样说,只要同步块执行的频率没达到JIT编译器的要求,那么该

2020-07-21 22:01:10 138

原创 用枚举方式实现单例

示例demo:public class Singleton { public Singleton() { } //枚举EnumHolder private enum EnumHolder { INSTANCE; private Singleton instance; EnumHolder() { this.instance = new Singleton(); }

2020-07-20 21:13:54 174 2

原创 volatile关键字能修饰在哪些地方?

volatile关键字可以修饰在类变量或者实例变量上,不能修饰在方法参数,局部变量,实例常量以及类常量上。

2020-07-20 12:15:30 2101

原创 CPU缓存不一致性问题的两种处理方式

由于CPU的读写速度远远大于内存的读写速度,所以为了解决CPU访问主内存效率低下的问题,CPU引入了缓存。这时因为主内存和缓存都会存有数据,那么势必要保证缓存中的数据和主内存数据的一致。特别是多线程情况下,如果两个线程同时从CPU缓存中读取的值i为1,二者同时对i+1,然后写回主内存,那么i的值回变为2,但实际上i进行了2次+1的操作,实际值应该是3。这就是CPU缓存不一致导致的问题。解决方法:总线加锁,由于CPU和其他组件都是通过总线(数据总线,控制总线,地址总线)来通信,不过如果采用总线加锁的.

2020-07-20 12:15:06 2040

空空如也

空空如也

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

TA关注的人

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