自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 SpringCloud-05-OpenFeign服务接口调用

转载https://blog.csdn.net/liujia2115/article/details/106254684

2020-12-09 11:45:55 133 1

原创 Spring Beans 自动装配

Spring Beans 自动装配一、 Beans 自动装配你已经学会如何使用元素来声明 bean 和通过使用 XML 配置文件中的和元素来注入 。Spring 容器可以在不使用和 元素的情况下自动装配相互协作的 bean 之间的关系,这有助于减少编写一个大的基于 Spring 的应用程序的 XML 配置的数量。自动装配模式下列自动装配模式,它们可用于指示 Spring 容器为来使用自动装配进行依赖注入。你可以使用元素的 autowire 属性为一个 bean 定义指定自动装配模式。模式 描述

2020-11-19 17:59:29 141

原创 Spring 依赖注入

Spring 依赖注入一、 概念Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系。依赖注入每个基于应用程序的 java 都有几个对象,由这些对象一起工作来呈现出终端用户所看到的工作的应用程序。当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能独立于其他 Java 类来增加这些类重用的可能性,并且在做单元测试时,测试独立于其他类的独立性。依赖注入(或有时称为布线)有助于把这些类粘合在一起,同时保持他们独立。假设你有一个包含文本编辑器组件的应用程序,并且你想要

2020-11-19 17:31:18 145

原创 Spring IoC讲解

Spring IoC讲解一、 Spring IoC容器1、IoC容器IoC容器具有依赖注入功能的容器,它可以创建对象,IoC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例,控制权由程序员控制,而“控制反转”是指new实例工作不由程序员来做而是交给Spring容器来做。在Spring中BeanFactory是IoC容器的实际代表者。2、Spring BeanFactory容器 Spring中BeanFactory容器这是一个最简单的容器,它主要的功能是为依赖注入

2020-11-19 16:56:02 124

原创 死锁编码及其定位

死锁编码及其定位1.死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉他们,那他们将无法推进下去。如果系统资源充足,进程的资源请求都能够得到满足。死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。2.产生死锁的原因(1).系统资源不足(2).进程运行推进的顺序不合适(3).资源分配不当3.死锁代码package com.example.demo;import java.util.concurrent.TimeUnit;class Ho

2020-07-12 23:12:54 132

原创 线程池

线程池1.线程池的主要工作是什么?线程池做的工作主要是控制运行的线程的数量。处理工程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等待,等其他线程执行完毕,再从队列中取出来任务执行。2线程池主要特点:线程复用,控制最大并发数,管理线程。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗

2020-07-12 22:28:10 86

原创 阻塞队列实现生产者消费者

阻塞队列实现生产者消费者package com.example.demo;import org.springframework.util.StringUtils;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.Atomi

2020-07-08 22:06:57 126

原创 Synchronized和Lock的区别,用Lock有什么好处

Synchronized和Lock的区别,用Lock有什么好处1.Synchronized和Lock的区别(1).原始构成Synchronized是关键字属于JVM层面,monitorenter(底层是通过monitor对象来完成,只是wait/notify等方法也是依赖于monitor对象,只有在同步代码块或方法中才能调用wait/notify等方法)monitorexit退出。(2).使用方法Synchronized不需要用户手动释放锁,当Synchronized代码执行完毕之后,系统会自动让

2020-07-08 21:38:42 281

原创 Lock实现生产者消费者

Lock实现生产者消费者package com.example.demo;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class ShareData { private int number =

2020-07-08 21:04:50 265

原创 阻塞队列

阻塞队列1.什么是阻塞队列?阻塞队列,顾名思义,首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如下当阻塞队列为空时,从队列中获取元素的操作会被阻塞。当阻塞队列为满时,往队列中插入元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程会被阻塞,直到其他的线程往非空的线程插入新的元素。同样,试图往已满的阻塞队列中插入元素的线程会被阻塞,直到其他的线程从队列中移除一个或者多个后是队列重新变的空闲起来并进行后续的添加。2.为什么要用BlockingQueue因为BlockingQueue

2020-07-08 20:38:55 133

原创 Semaphore类的使用

Semaphore类的使用package com.example.demo;import java.util.concurrent.Semaphore;import java.util.concurrent.TimeUnit;/** * Created by Administrator on 2020/7/6. * 多个线程抢多个资源--可用于加锁 * 作用:一个是用于多个共享资源的互斥使用,另一个用于高并发线程数的控制 * * @author qtx */public class

2020-07-06 20:12:38 156

原创 CyclicBarrier类的使用

CyclicBarrier类的使用package com.example.demo;import java.util.concurrent.CyclicBarrier;/** * Created by Administrator on 2020/7/6. * CyclicBarrier计数器加法 * CyclicBarrier的字面意思就是可循环使用的屏障, * 他要做的事情是,让一组线程达到一个屏障(也 * 可以叫同步点)时被阻塞,直到最后一个线程达到屏障时, * 屏障才会开门,所以

2020-07-06 19:58:24 141

原创 CountDownLatch类作用

CountDownLatch这个类是一个同步的辅助类,相当于一个计数器。保证某些特等的场景必须执行完成之后才能进行下面的操作!package com.example.demo;import java.util.concurrent.CountDownLatch;/** * Created by Administrator on 2020/7/5. * CountDownLatch 倒计时 * * @author qtx */public class CountDownLatchDem

2020-07-05 22:20:11 324

原创 读锁(共享锁)写锁(独占锁)解析

读锁(共享锁)写锁(独占锁)解析在多线程环境下一个资源类被读是没有任何问题的,所以满足并发要求,但是,如果有一个线程去写共享资源,那么就不应该再有其他线程可以对该资源进行读或写了。也就是说,读-读可以共存,读-写不能共存,写-写不能共存。举例说明:首先我们手写一个缓存类,不加锁看执行结果package com.example.demo;import java.util.HashMap;import java.util.HashSet;import java.util.Map;import

2020-07-05 21:24:43 614

原创 自旋锁解析及自写自旋锁

自旋锁解析及自写自旋锁1.什么叫自旋锁?是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样做的好处是减少了线程的上下文切换的消耗,但是缺点是循环会消耗CPU2.手写自旋锁package com.example.demo;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicReference;/** * Created by Administrator on 2020

2020-07-05 19:19:45 274

原创 synchronized和ReentrantLock可重入锁

synchronized和ReentrantLock可重入锁1.可重入锁是什么?可重入锁也叫作递归锁。指的是同一个线程外层函数获取到锁之后,内层递归函数仍然能获取到该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。也就是说,线程可以进入任何一个它已经拥有的锁所同步的代码块。2.synchronized可重入锁证明package com.example.demo;import java.util.concurrent.locks.Lock;import java.uti

2020-07-05 18:39:22 163

原创 高并发场景下HashSet和HashMap线程不安全问题解析

1.HashSet和HashMap在高并发场景下也会报java.util.ConcurrentModificationException异常2.解决办法:Set s= new CopyOnWriteArraySet<>(); private final CopyOnWriteArrayList<E> al; /** * Creates an empty set. */ public CopyOnWriteArraySet() {

2020-07-05 17:12:49 473

原创 高并发场景下ArrayList线程不安全问题解析

高并发场景下ArrayList线程不安全问题解析1.在高并发下ArrayList存在并发修改异常package com.example.demo;import java.util.ArrayList;import java.util.List;import java.util.UUID;import java.util.concurrent.CopyOnWriteArrayList;/** * Created by Administrator on 2020/7/5. * * @au

2020-07-05 16:52:12 639

原创 CAS的ABA问题

CAS的ABA问题1.什么是ABA问题CAS算法实现的一个重要前提就是需要取出内存中的某时刻的数据并在当前时刻比较并替换,那么在这个时间差之内会导致数据的变化。例如有一个线程T1从内存地址X中取出A,这时另一个线程T2也从内存地址X中取出A,并且线程T2进行了一系列操作将值改变成B,写回主物理内存。然后线程T2又将内存地址为X的数据变为A,这个时候线程T1进行了CAS操作发现内存中仍然是A,这时线程T1进行CAS操作成功。尽管线程T1的CAS操作成功,但并不代表这个过程就没有问题,这就是ABA问题。

2020-07-04 23:30:17 274

原创 CAS底层实现原理

CAS底层实现原理1.首先什么是CAS?Compare And Swap =========>compareAndSwapInt,它是一条CPU并发原语。它的功能时判断内存的某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。CAS并发原语体现在JAVA语言中就是sun.misc.Unsafe类中的各个方法。调用Unsafe类的CAS方法,JVM会帮我们实现CAS汇编指令。这是一种完全依赖于硬件的功能。通过它实现了原子操作,**再次强调,由于CAS是一种系统原语,原语属于操作系统英

2020-07-04 21:06:25 1588

原创 在多线程环境下单例双检锁模式线程不一定安全

在多线程环境下单例双检锁模式线程不一定安全1.在说明这个问题之前,我们先要弄清楚为什么加了synchronized关键字还不能保证线程安全。synchronized关键字只能保证有序性,并不能禁止指令重排,这就是为什么会出现线程不安全的原因。在硬件层面,如处理器优化和指令重排等,但是这些技术的引入就会导致有序性问题。最好的解决有序性问题的办法,就是禁止处理器优化和指令重排,就像volatile中使用内存屏障一样。但是,虽然很多硬件都会为了优化做一些重排,但是在Java中,不管怎么排序,都不能影响单线程

2020-07-04 16:13:43 470

原创 单例模式的创建方法

单例模式的创建方法1.懒汉模式package com.example.demo;/** * Created by Administrator on 2020/7/4. * 单例模式之懒汉模式 */public class SingletonDemo { private SingletonDemo singletonDemo; private SingletonDemo() { } public SingletonDemo getInstance() {

2020-07-04 15:39:58 360

原创 Volatile如何保证有序性(禁止指令重排)

Volatile如何保证有序性(禁止指令重排)1.首先我们要了解计算机在执行程序时,为了提高性能,编译器和处理器一般都会对指令做重排,一般分为以下三种:单线程环境里面去报程序最终执行的结果和代码顺序执行的结果一致。处理器在进行指令重排时必须要考虑指令之间的数据依赖性。多线程环境中线程交替执行,由于编译器优化重排的存在,两个或多个线程中使用的变量能否保证一致是不能确定的,最后执行的结果也是无法预测的。2.volatile实现禁止指令重排优化,从而避免在多线程环境下程序出现乱排序执行的现象。(1).

2020-07-04 15:14:35 3246 1

原创 Volatile不保证原子性案例分析

Volatile不保证原子性案例1.什么叫做原子性原子性就是一件事情不可分割,需要保证完整性。言外之意就是某个线程在完成某件任务,是不可被打断,加塞的,是不可分割的。要么同事成功,要么同时失败。2.Volatile不保证原子性案例package com.example.demo;import org.springframework.util.CollectionUtils;import org.springframework.util.StringUtils;import java.util.

2020-07-04 14:03:59 329

原创 Volatile关键字的特性及其可见性的验证

volatile特性:保证可见性、不保证原子性、有序性(禁止指令重排)Volatile是java虚拟机提供的轻量级的同步机制不加Volatile关键字package com.example.demo;import org.springframework.util.CollectionUtils;import org.springframework.util.StringUtils;import java.util.*;import java.util.concurrent.TimeUnit;

2020-07-03 20:00:07 225

原创 JMM(Java内存模型)入门讲解

JMM(Java内存模型)JMM(java内存模型)本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JMM关于同步的规定:1、线程解锁前,必须把共享变量的值刷新回主内存(堆内存、硬盘)2、线程加锁前,必须读取主内存的最新值到自己的工作内存(栈内存)3、加锁解锁是同一把锁由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称作栈空间),工作内存是每个线程的私有数

2020-07-03 19:20:16 914

空空如也

空空如也

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

TA关注的人

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