自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 收藏
  • 关注

原创 jvm的双亲委派机制

当我们的类加载器收到一个请求的时候,首先会向上查找最顶层的没有父类的类加载器(启动类加载器),然后会依次向下读取class文件,如果该类加载器读取到class文件的时候,子节点不会再继续读取。...

2020-09-16 11:40:55 206

原创 springcloud 中bootstrap.yml和application.yml区别

本人在配置zuul动态路由转发的时候,出现了一个小问题,写在application.yml中的配置信息读取不出来了,但是换成bootstrap.yml,就可以了,所以我在csdn里面定位问题,有个链接如下:https://www.cnblogs.com/vwater/p/10374515.html所以在springcloud中,能用bootstrap.yml的地方,就不要用applicatio...

2019-12-27 19:22:40 448

原创 基于Hystrix解决服务雪崩效应原理

服务降级在高并发的情况下,防止客户一直等待,使用服务器降级方式(会返回给用户一个友好提示,不会去处理请求,调用fallBack本地方法,)目的是为了提高用户体验。服务熔断服务熔断目的是为了保护服务,在高并发的情况下,如果请求达到了一定的极限(可以自己设置数字),如果流量超出了自己设置的数字,就会自动开启服务保护功能,使用服务降级的方式来返回一个友好的提示,服务熔断和服务降级一起使用。服务隔...

2019-12-26 11:58:50 298

原创 Hystrix

HystrixHystrix是国外知名的视频网站Netflix所开源的非常流行的高可用架构框架。Hystrix能够完美的解决分布式系统架构中打造高可用服务面临的一系列技术难题。Hystrix “豪猪”,具有自我保护的能力。hystrix 通过如下机制来解决雪崩效应问题。在微服务架构中,我们把每个业务都拆成了单个服务模块,然后当有业务需求时,服务间可互相调用,但是,由于网络原因或者其他一些因素...

2019-12-26 11:20:16 241 1

原创 服务雪崩效应

服务雪崩效应默认情况下tomcat只有一个线程池去处理客户端发过来的所有服务请求,这样的话,在高并发的情况下,如果客户端所有的请求都堆积到同一个服务接口上,就会产生tomcat的所有线程去处理这个服务接口,可能会导致其他服务接口无法访问,就会导致其余的服务接口在访问的时候,产生延迟和等待,这个效果和雪崩一样,就是一个地方坏了, 会导致连环效应,就是所谓的服务雪崩效应。...

2019-12-26 09:57:25 157

原创 服务治理SpringCloud Eureka

什么是服务治理在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。服务注册与发现在服务注册与发现中,有一个注册中心,当服务器启动的时候,会把当前自己服务器的信息 比如 服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际...

2019-12-24 16:37:00 116

原创 创建springboot项目

创建springboot项目pom文件引入<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</ver...

2019-12-23 11:51:54 98

原创 什么是springBoot

SpringBoot它是一个快速整合第三方框架,简化xml配置,完全采用注解化,内置Http服务器(tomcat),最终是java应用程序进行运行。为啥要用springBoot因为传统项目中,比如ssh或者ssm,配置文件多,jar包冲突很多,整合起来比较麻烦,为了快速开发,我们选择SpirngBootSpringBoot和SpirngCloud的关系springcloud是一套目前完整...

2019-12-23 10:28:08 268

原创 java自旋锁

自旋锁自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区 private AtomicReference<Thread> sign =new AtomicReference<>(); public void lock() { Thread current = Thread.currentThread(); whil...

2019-12-20 16:44:28 130

原创 CAS无锁机制

CAS无锁机制(1)与锁相比,使用比较交换(下文简称CAS)会使程序看起来更加复杂一些。但由于其非阻塞性,它对死锁问题天生免疫,并且,线程间的相互影响也远远比基于锁的方式要小。更为重要的是,使用无锁的方式完全没有锁竞争带来的系统开销,也没有线程间频繁调度带来的开销,因此,它要比基于锁的方式拥有更优越的性能。(2)无锁的好处:第一,在高并发的情况下,它比有锁的程序拥有更好的性能;第二,它天生...

2019-12-20 16:38:26 132

原创 java读写锁

读写锁假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写(译者注:也就是说:读-读能共存,读-写不能共存,写-写不能共存)。这就需要一个读/写锁来解决这个问题。Java5在java.util.con...

2019-12-20 16:20:06 531

原创 java重入锁

重入锁锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利。重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁下面有两段代码...

2019-12-20 15:49:17 133

原创 java悲观锁和乐观锁

悲观锁和乐观锁场景当多个请求同时操作数据库时,首先将订单状态改为已支付,在金额加上200,在同时并发场景查询条件下,会造成重复通知。悲观锁:每次拿数据的时候,都会上锁悲观锁:悲观锁悲观的认为每一次操作都会造成更新丢失问题,在每次查询时加上排他锁。每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到...

2019-12-20 15:31:23 119

原创 合理配置线程池

合理配置线程池要想合理的配置线程池,就必须首先分析任务特性,可以从以下几个角度来进行分析:任务的性质:CPU密集型任务,IO密集型任务和混合型任务。任务的优先级:高,中和低。任务的执行时间:长,中和短。任务的依赖性:是否依赖其他系统资源,如数据库连接。CPU密集型时,任务可以少配置线程数,大概和机器的cpu核数相当,这样可以使得每个线程都在执行任务IO密集型时,大部分线程都阻塞,故需...

2019-12-20 15:10:51 138

原创 线程池原理分析

提交一个任务到线程池中,线程池的处理流程如下:1、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。2、线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。3、判断线程池里的线程是否都处于工作状态,如果没有,则...

2019-12-20 15:04:53 137

原创 线程池的4种创建方式

线程池四种创建方式Java通过Executors(jdk1.5并发包)提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool 创建一个定长线...

2019-12-20 14:38:11 971

原创 多线程之线程池

什么是线程池?为什么要用到线程池?使用线程池的好处是啥?首先我们来说说为什么要用到线程池?使用线程池的好处是啥?在程序中创建,启动,销毁一个线程是非常耗时的操作。所以我们要想办法优化,就有了线程池使用了线程池就可以管理我们的线程,提高程序效率,什么是线程池?在开发过程中,合理地使用线程池能够带来3个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二...

2019-12-20 12:16:43 108

原创 多线程BlockingQueue模拟生产者与消费者

和我之前的例子一样,直接上源码:package com.newDemo.controller.test;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.TimeUnit;import java.uti...

2019-12-20 09:19:26 162

原创 java并发包Semaphore信号量

Semaphore是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做自己的事情后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore可以用来构建一些对象池,资源池之类的,比如数据库连接池,我们也可以创建计数为1的Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,表示两种互斥状态。它的用法如下:availablePermits函数用来获取...

2019-12-19 17:40:10 256

原创 java并发包CyclicBarrier

CyclicBarrier初始化时规定一个数目,然后计算调用了CyclicBarrier.await()进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续。CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。CyclicBarrier初始时还可带一个Runnable的参数, 此Runnable任务在Cyclic...

2019-12-19 16:36:05 171

原创 java并发包CountDownLatch

CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。这里举个例子:比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。代码如下:package com.newDemo.controller.test;import java.util.concurrent.Co...

2019-12-19 16:07:24 148

原创 多线程ThreadLocal

什么是多线程ThreadLocaThreadLocal提供一个线程的局部变量,访问某个线程拥有自己局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。简单的一句话:就是它让变量不会共享,每个线程都有各自的变量。ThreadLoca方法如下:1.void ...

2019-12-19 11:55:03 213

原创 如何停止线程?

停止线程思路使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。使用interrupt方法中断线程。(表示让当前等待的线程直接抛出异常)代码如下:package com.newDemo.controller.test;class stopThr...

2019-12-19 11:18:28 91

原创 Lock 接口与 synchronized 关键字的区别

Lock 接口与 synchronized 关键字的区别Lock 接口可以尝试非阻塞地获取锁 当前线程尝试获取锁。如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁。Lock 接口能被中断地获取锁 与 synchronized 不同,获取到锁的线程能够响应中断,当获取到的锁的线程被中断时,中断异常将会被抛出,同时锁会被释放。Lock 接口在指定的截止时间之前获取锁,如果截止时间到了依旧...

2019-12-19 10:50:13 112

原创 多线程Lock锁实现线程同步

在之前的文章中,使用synchronized同步代码块, wait(); notify();解决了线程同步问题,那么除了这个办法,还可以使用lock锁。还是之前的例子:lock用法如下:Lock lock = new ReentrantLock();lock.lock();try{//可能会出现线程安全的操作}finally{//一定在finally中释放锁//也不能把获取锁在t...

2019-12-19 10:45:27 692

原创 多线程wait()和sleep()的区别

多线程wait()和sleep()的区别wait()位于同步中,可以释放锁的资源sleep()不是释放锁的资源wait需要notify才能从休眠状态变为运行状态,sleep到期之后,会自动从休眠状态变为运行状态。官方话语如下对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。sleep()方法导致了程序暂停执行指定的...

2019-12-18 18:54:59 118

原创 多线程之间实现通讯

多线程之间如何实现通讯什么是多线程之间通讯?多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。画图如下:我这里有个例子:就是弄两个线程,一个进行写,一个进行读,写的话,如果是偶数,就是java,男。如果是奇数,就是php 女,。代码如下:package com.newDemo.controller.test;//共享资源class res{ public ...

2019-12-18 18:39:23 288

原创 volatile与synchronized区别

仅靠volatile不能保证线程的安全性。(原子性)①volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法②volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢...

2019-12-18 16:55:06 75

原创 多线程AtomicInteger原子类

我的上一篇博文讲到了,Volatile不能保证原子性,代码如下:package com.newDemo.controller.test;import java.util.concurrent.atomic.AtomicInteger;public class threadDemo15 extends Thread { private volatile static int coun...

2019-12-18 16:42:15 134

原创 多线程Volatile关键字详解

Volatile 关键字的作用是变量在多个线程之间可见。但是不保证线程的原子性。下面我就写个例子来证明一下volatilepackage com.newDemo.controller.test;class VolatileDemo extends Thread{ public boolean flag = true; public void run(){ System.out.p...

2019-12-18 15:44:44 163

原创 java内存模型

java内存模型和java内存结构是2个概念,大家一定要分清了这里我先复制网上的一段话,如下:共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储...

2019-12-18 11:55:51 96

原创 多线程三大特性

多线程三大特性原子性可见性有序性原子性独一无二,一致性,保证线程安全问题即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。一个很经典的例子就是银行账户转账问题:比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。这2个操作必须要具备原子性才能保证不出现一些意外的问题。我们操作数据也是如此,...

2019-12-18 11:12:18 91

原创 多线程死锁

多线程死锁是什么?就是同步中嵌套同步,无法释放锁,导致程序一直等待下面就是代码,我们模拟一段死锁现象package com.newDemo.controller.test;class trainDemo14 implements Runnable{ /** * 当一个变量被static修饰时,就会放到jvm的方法区,当class文件被加载的时候就会初始化 */ private...

2019-12-18 10:54:15 113

原创 多线程静态同步函数

多线程静态同步函数和非静态同步函数的区别是啥?静态同步函数:就是方法使用了static关键字修饰非静态同步函数:没有用static关键字修饰的方法,也就是使用this锁的同步函数那么静态同步函数使用的啥锁呢?分析:两个线程,一个线程使用静态同步函数,一个使用同步代码块this锁,如果线程不同步(线程不安全),就说明静态同步函数使用的不是this锁,如果线程同步,就说明使用的是this锁。...

2019-12-17 20:45:16 304

原创 多线程安全问题

什么是线程安全问题?当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会受到其他线程的干扰,会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。案例分析需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。分析就是说两个窗口要同时买票,但是不能重复,总票数100张,不能卖同一张,卖完为止。代码如下:package com.n...

2019-12-17 19:58:04 255

原创 多线程模拟发送短信

现在有个需求,5分钟之内发送通知短息给12000个人,假设用多线程发的话,最好根据cpu的性能,确定线程数,每个线程发送2000个人的短信,那么这个例子如下:有三个类,一个用户类,一个工具类,一个发送类package com.newDemo.controller.sendmq;public class UserEntity { private String userId; priv...

2019-12-17 10:28:39 1422 2

原创 现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行

这个是多线程经常会遇到的面试题,其实这个我们分析一下,无非就是在t2线程里面申明t1.join(),在t3线程里面t2.join();这样就可以了package com.newDemo.controller.test;public class threadDemo7 { public static void main(String[] args) throws InterruptedEx...

2019-12-16 18:29:24 840

原创 多线程join方法

join作用是让其他线程变为等待, t1.join();// 让其他线程变为等待,直到当前t1线程执行完毕,才释放。thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。需求:有两个线程,主线程和子线程,这里要让子线程执行完毕之后,再让主线程执行,这个时候代码如...

2019-12-16 18:12:43 220

原创 多线程运行状态

面试的时候,经常会有面试官问到多线程的状态有哪些,分别是啥,简述一下,这个时候,我们要知道 。线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。针对每一个状态,其实我自己也画图,如下:新建状态当用new操作符创建一个线程时, 例如new Thread®,线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始...

2019-12-16 17:51:15 148

原创 守护线程和非守护线程

Java中有两种线程,一种是用户线程,另一种是守护线程。用户线程:指用户自定义创建的线程,主线程停止,用户线程不会停止(和主线程互不影响)守护线程 :当进程不存在或主线程停止,守护线程也会被停止。(gc就是守护线程)(和主线程一起销毁)使用setDaemon(true)方法设置为守护线程下面的这个例子可以通过setDaemon(true)方法来体现出守护线程和非守护线程的区别。packa...

2019-12-16 17:28:36 111

空空如也

空空如也

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

TA关注的人

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