自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 2021-04-22

https://www.jianshu.com/p/9bcac608c71411|010、代理模式为什么要学习代理模式,因为AOP的底层机制就是动态代理!【SpringAOP和SpringMVC】代理模式:静态代理 动态代理学习aop之前 , 我们要先了解一下代理模式!11|110.1、静态代理静态代理角色分析 抽象角色 : 一般使用接口或者抽象类来实现 真实角色 : 被代理的角色 代理角色 : 代理真实角色 ; 代理真实角色后 , 一般会做一些附属的

2021-04-22 12:04:38 55

转载 代理模式详解

代理模式为其他对象提供一个代理以控制对某个对象的访问。代理类主要负责为委托了(真实对象)预处理消息、过滤消息、传递消息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。其实就是代理类为被代理类预处理消息、过滤消息并在此之后将消息转发给被代理类,之后还能进行消息的后置处理。代理类和被代理类通常会存在关联关系(即上面提到的持有的被带离对象的引用),代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。静态代理创建一个接口,然后创建被代理的类实现该接口并且实现

2021-04-22 12:04:21 105

转载 深入理解CGLIB动态代理机制

本文是基于CGLIB 3.1进行探究的cglib is a powerful, high performance and quality Code Generation Library, It is used to extend JAVA classes and implements interfaces at runtime.在Spring AOP中,通常会用它来生成AopProxy对象。不仅如此,在Hibernate中PO(Persistant Object 持久化对象)字节码的生成工作也要靠它

2021-04-22 12:03:31 322

原创 ReadWriteLock

Java并发包中ReadWriteLock是一个接口,主要有两个方法,如下:https://www.jianshu.com/p/9cd5212c8841看的我好迷呀public interface ReadWriteLock { /** * Returns the lock used for reading. * * @return the lock used for reading */ Lock readLock(); /**

2021-04-21 17:53:19 70

原创 集合不安全

1)List 不安全//java.util.ConcurrentModificationException 并发修改异常!public class ListTest { public static void main(String[] args) { List<Object> arrayList = new ArrayList<>(); for(int i=1;i<=10;i++){ new Threa

2021-04-21 09:34:00 105 1

原创 8锁现象

5. 8锁现象如何判断锁的是谁!锁到底锁的是谁?锁会锁住:对象、Class深刻理解我们的锁问题1两个同步方法,先执行发短信还是打电话public class dome01 { public static void main(String[] args) { Phone phone = new Phone(); new Thread(() -> { phone.sendMs(); }).start(); TimeUnit

2021-04-21 09:19:11 100

原创 卖票和生产者和消费者的问题读写读者和写着问题

一般呢多线程会操作共享变量,所以为了可扩展,将共享变量封装起来,并且封装其对应的操作。第二步定义线程体。第三步,定义线程个数。package com.example.studyexample.duoxiancheng;import java.util.concurrent.locks.ReentrantLock;public class ticket extends Thread { private cache cache = new cache(); @Override

2021-04-20 15:44:43 131 1

转载 单例模式理解

引用https://www.cnblogs.com/garryfu/p/7976546.html一、单例模式定义:单例模式确保某个类只有一个实例(构造器私有),而且自行实例化(实例化的对象属于类)并向整个系统提供这个实例(有get方法)。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中...

2021-04-20 13:24:32 618

转载 单例模式中volatile关键字的作用

什么是单例模式单例模式指的是,保证一个类只有一个实例,并且提供一个可以全局访问的入口。为什么需要使用单例模式那么我们为什么需要单例呢?其中一个理由,那就是为了节省内存、节省计算。因为在很多情况下,我们只需要一个实例就够了,如果出现更多的实例,反而纯属浪费。下面我们举一个例子来说明这个情况,以一个初始化比较耗时的类来说,代码如下所示:public class ExpensiveResource { public ExpensiveResource() { ...

2021-04-20 10:07:02 145

转载 内部类与静态内部类

内部类与静态内部类目录前言 内部类 1.1 非静态内部类 1.1.1 定义 1.1.2 内部类的特殊语法规则 1.2 静态内部类回到顶部前言  如果你是一个急性子,没什么耐性的人,可以只看下句,自己去品味理解:  内部类:就是我是你的一部分,我了解你,我知道你的全部,没有你就没有我。(所以内部类对象是以外部类对象存在为前提的)  静态内部类:就是我跟你没关系,自己可以完全独立存在,但是我就借你的壳用一下,来隐藏自己。  如果还不知道静态和普通成员..

2021-04-20 09:41:26 2715 1

原创 synchronized和ReentrantLock 的区别

12. synchronized和ReentrantLock 的区别1.两者都是可重入锁可重入锁:重入锁,也叫做递归锁,可重入锁指的是在一个线程中可以多次获取同一把锁,比如: 一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法,而无需重新获得锁, 两者都是同一个线程每进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。2.synchronized 依赖于 JVM 而 ReentrantLock 依赖于 APIsync.

2021-04-19 16:55:49 253

转载 JUC并发编程学习笔记(狂神)

感谢原作者和狂神https://blog.csdn.net/weixin_44491927/article/details/108560692JUC并发编程 1. 什么是JUC 2. 线程和进程 1)进程 2)线程 3)并发 4)并行 5)线程的状态 6)wait/sleep 3.Lock 1)传统的 synchronized 2)Lock 3. Synchronized 与Lock 的区别 4. 生..

2021-04-19 13:59:35 142

转载 java中Condition类的详细介绍(详解)

java中Condition类的详细介绍(详解)南 墙2019-08-04 17:09:1836033收藏99分类专栏:# Java学习Java学习之旅文章标签:javaCondition详细介绍详解版权已找不到原文了,还望原文博主看到能告诉小白一下,一定标注原文地址一 condition 介绍及demo Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的w...

2021-04-19 12:50:06 488

转载 synchronized的实现原理与应用

synchronized的实现原理与应用在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但 是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。本文 详细介绍Java SE 1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级 锁,以及锁的存储结构和升级过程。先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现 为以下3种形式。·对于普通同步方法,

2021-04-19 10:22:33 72

转载 ThreadPoolExecutor线程池的使用

Java并发编程:线程池的使用Java并发编程:线程池的使用  在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:  如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。  那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?  在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的

2021-04-19 09:14:49 1224

原创 狂神多线程

学习视频参考链接:https://www.bilibili.com/video/BV1V4411p7EF?p=27线程简介 线程的实现(重点) 线程状态 线程同步(重点) 线程通信问题 高级主题(重点)文章目录1、线程简介 2、线程实现 2.1 继承 Thread 类,重写 run 方法 2.2 继承 Runnable 接口,创建 Tread 对象 2.3 实现 Callable 接口(了解) 2.4 Lamda 表达式 2.5 静态代理模式 3、线程的 5 种状态.

2021-04-19 08:03:22 291

原创 Executors线程池

简介线程Thread是一个重量级资源,线程的创建、启动以及销毁都是比较耗费系统资源的,同时受限于系统资源的限制,线程的数量与系统性能是一种抛物线的关系,因此对线程的管理,是一种非常好的程序设计习惯,自JDK1.5起,utils包提供了ExecutorService[ɪɡˈzɛkjətɚ]线程池的实现。通俗的将:为了避免重复的创建线程,线程池的出现可以让线程进行复用。当有工作来,就会向线程池拿一个线程,当工作完成后,并不是直接关闭线程,而是将这个线程归还给线程池供其他任务使用。一个线程池包括以下四个基本

2021-04-19 08:02:08 627

原创 SpringMVC学习笔记

https://www.cnblogs.com/renxuw/p/13033344.html开始学习SpringMVC同样留一份记录,以便日后查看东西都是B站Up狂神的视频地址:https://www.bilibili.com/video/BV1aE41167Tu文章地址:https://blog.csdn.net/qq_33369905/article/details/105828924...

2021-04-16 08:22:07 69

转载 什么是死锁?

https://blog.csdn.net/hd12370/article/details/82814348所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。如下图所示:产生死锁的原因?可归结为如下两点:a. 竞争资源系统中的资源可以分为两类:可剥夺资源,是指某进程

2021-04-15 21:59:15 327

原创 实战:OutOfMemoryError异常

2.4 实战:OutOfMemoryError异常本节实战的目的有两个:第一,通过代码验证《Java虚拟机规范》中描述的各个运行时区域储存 的内容;第二,希望读者在工作中遇到实际的内存溢出异常时,能根据异常的提示信息迅速得知是哪 个区域的内存溢出,知道怎样的代码可能会导致这些区域内存溢出,以及出现这些异常后该如何处 理。本节所列的代码均由笔者在基于OpenJDK 7中的HotSpot虚拟机上进行过实际测试,如无特殊说 明,对其他Op enJDK版本也应当适用。不过读者需意识到内存溢出异常与虚拟机本身

2021-04-14 14:53:50 1495

原创 实战:OutOfMemoryError异常

2.4 实战:OutOfMemoryError异常本节实战的目的有两个:第一,通过代码验证《Java虚拟机规范》中描述的各个运行时区域储存 的内容;第二,希望读者在工作中遇到实际的内存溢出异常时,能根据异常的提示信息迅速得知是哪 个区域的内存溢出,知道怎样的代码可能会导致这些区域内存溢出,以及出现这些异常后该如何处 理。本节所列的代码均由笔者在基于OpenJDK 7中的HotSpot虚拟机上进行过实际测试,如无特殊说 明,对其他Op enJDK版本也应当适用。不过读者需意识到内存溢出异常与虚拟机本身

2021-04-14 14:53:06 640

原创 对象创建及访问

2.3.1 对象的创建Java是一门面向对象的编程语言,Java程序运行过程中无时无刻都有对象被创建出来。当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到 一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那 必须先执行相应的类加载过程,本书第7章将探讨这部分细节。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成 后便可完全确定(如何确定将在2.3.2节中介绍),为对象...

2021-04-14 14:52:52 104

原创 类结构及类加载

7.1 概述上一章我们学习了Class文件存储格式的具体细节,在Class文件中描述的各类信息,最终都需要加 载到虚拟机中之后才能被运行和使用。而虚拟机如何加载这些Class文件,Class文件中的信息进入到虚 拟机后会发生什么变化,这些都是本章将要讲解的内容。Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最 终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。与那些在编译时需 要进行连接的语言不同,在Java语言里面,类型的加载

2021-04-14 14:49:52 111

原创 并发已废弃

​一个应用程序一个进程或多个进程。一个进程多个线程​1. 线程和进程有什么区别?​​线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位资源开销:每个进程都有独立..

2021-04-04 09:48:43 161

原创 线程池

1、什么是线程池 java.util.concurrent.Executors 提供了一个 java.util.concurrent.Executor 接 口的实现用于创建线程池 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器 单元的闲置时间,增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执 行任务的时间,T3 销毁线程时间。 如果:T1 + T3 进大于 T2,则可以采用线程池...

2021-04-04 09:47:25 190

原创 并发

一个应用程序一个进程或多个进程。一个进程多个线程1. 线程和进程有什么区别?线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位资源开销:每个进程都有独立的...

2021-04-04 09:43:26 3023

转载 Java并发之AQS详解(文章里包含了两片文章结合着看后边文章不清楚,请看原文)

队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组 件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获 取线程的排队工作‘Java并发之AQS详解一、概述  谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!  类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许

2021-04-04 07:48:50 182

转载 I/O

SocketCyC201812861#一、I/O 模型一个输入操作通常包括两个阶段:等待数据准备好 从内核向进程复制数据对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待数据到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区。Unix 有五种 I/O 模型:阻塞式 I/O 非阻塞式 I/O I/O 复用(select 和 poll) 信号驱动式 I/O(SIGIO) 异步 I/O(AIO)#阻塞式 I/O...

2021-04-03 08:14:05 82

转载 HTTP知识点

HTTPCyC201821447#一 、基础概念#请求和响应报文客户端发送一个请求报文给服务器,服务器根据请求报文中的信息进行处理,并将处理结果放入响应报文中返回给客户端。请求报文结构:第一行是包含了请求方法、URL、协议版本; 接下来的多行都是请求首部 Header,每个首部都有一个首部名称,以及对应的值。 一个空行用来分隔首部和内容主体 Body 最后是请求的内容主体GET http://www.example.com/ HTTP/1.1Accept: text...

2021-04-03 08:13:42 583

转载 应用层

计算机网络 - 应用层CyC20189616#域名系统DNS 是一个分布式数据库,提供了主机名和 IP 地址之间相互转换的服务。这里的分布式数据库是指,每个站点只保留它自己的那部分数据。域名具有层次结构,从上到下依次为:根域名、顶级域名、二级域名。DNS 可以使用 UDP 或者 TCP 进行传输,使用的端口号都为 53。大多数情况下 DNS 使用 UDP 进行传输,这就要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。在两种情况下会使用 TCP 进行传输:...

2021-04-03 08:13:13 135

转载 网络层

计算机网络 -CyC201811292#概述因为网络层是整个互联网的核心,因此应当让网络层尽可能简单。网络层向上只提供简单灵活的、无连接的、尽最大努力交互的数据报服务。使用 IP 协议,可以把异构的物理网络连接起来,使得在网络层看起来好像是一个统一的网络。与 IP 协议配套使用的还有三个协议:地址解析协议 ARP(Address Resolution Protocol) 网际控制报文协议 ICMP(Internet Control Message Protocol...

2021-04-03 08:12:27 94

原创 链路层

计算机网络 - 链路层CyC20189455#基本问题#1. 封装成帧将网络层传下来的分组添加首部和尾部,用于标记帧的开始和结束。#2. 透明传输透明表示一个实际存在的事物看起来好像不存在一样。帧使用首部和尾部进行定界,如果帧的数据部分含有和首部尾部相同的内容,那么帧的开始和结束位置就会被错误的判定。需要在数据部分出现首部尾部相同的内容前面插入转义字符。如果数据部分出现转义字符,那么就在转义字符前面再加个转义字符。在接收端进行处理之后可以还原出原始数据。这个过程透...

2021-04-03 08:11:43 194

原创 https

二、HTTPS的验证流程这一部分看的比较多,主要归纳了一下,分5条。1)客户端发起一个http请求,连接到服务器的443端口。2)服务端把自己的信息以数字证书的形式返回给客户端(证书内容有密钥公钥,网站地址,证书颁发机构,失效日期等)。证书中有一个公钥来加密信息,私钥由服务器持有。3)验证证书的合法性客户端收到服务器的响应后会先验证证书的合法性(证书中包含的地址与正在访问的地址是否一致,证书是否过期)。4)生成随机密码(RSA签名)如果验证通过,或用...

2021-04-03 08:10:34 2392

转载 tcp1

今天聊聊TCP,老规矩,为了更符合读者的思考逻辑,文章依然由问题来组织: 在一个不可靠的网络中,如何做到可靠的传输? TCP的连接到底是啥? “三次握手”做了什么? “四次挥手”做了什么? 丢包重传是怎么做的? 服务器处理不过来了, 你能发慢点吗? 好慢啊,网络卡了? 先补充一点前置知识,我们讨论的TCP,属于TCP/IP模型的传输层(第四层),向下基于IP层,向上支撑了应用层。就像本文的结构一样,这个世界是...

2021-04-02 12:17:55 202

原创 TCP 基本认识

TCP 基本认识 TCP 连接建立 TCP 连接断开 Socket 编程 PS:本次文章不涉及 TCP 流量控制、拥塞控制、可靠性传输等方面知识,这些留在下篇哈!正文01 TCP 基本认识瞧瞧 TCP 头格式我们先来看看 TCP 头的格式,标注颜色的表示与本文关联比较大的字段,其他字段不做详细阐述。TCP 头格式序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发...

2021-04-02 12:16:23 200

转载 jvm内存结构

作者:程序员库森链接:https://www.nowcoder.com/discuss/627413来源:牛客网栈和程序计数器都是堆的一部分而且这种对象移动操作必须全程暂停用户应用 程序才能进行[1],这就更加让使用者不得不小心翼翼地权衡其弊端了,像这样的停顿被最初的虚拟机 设计者形象地描述为“Stop The World”[2]。内存的访问是用户程序最频繁的操作,甚至都没有之一,假如在这个环节上增加了额外的负担,势必会直接影响应用程序的吞吐量。关于...

2021-04-02 11:28:51 386

原创 范式

范式可以避免数据冗余,减少数据库的空间,减轻维护数据完整性的麻烦,但是操作困难,因为需要联系多个表才能得到所需要数据,而且范式越高性能就会越差。要权衡是否使用更高范式是比较麻烦的,一般在项目中,用得最多的也就是第三范式,我认为使用到第三范式也就足够了,性能好而且方便管理数据。1NF是关系模式应具备的最起码的条件,如果数据库设计不能满足第一范式,就不称为关系型数据库。关系数据库设计研究的关系规范化是在1NF之上进行的。第一范式(1NF)定义:如果关系模式R的每个关系r的属性都是不可分的数据项...

2021-04-02 11:27:26 180

原创 Socket

TCP 核心 API 讲解 socket():创建一个客户端 Socket。 bind():绑定一个 Socket 到一个本地地址和端口上。 accept():服务器端接受一个新的连接。 write():把数据写入到 Socket 输出流。 read():从 Socket 输入流中读取数据。 TCP 基础数据传输案例代码publicclassServer{privatestaticfinalintPOR...

2021-04-02 08:49:42 444

原创 volatile

一、定义Java内存模型(Java Memory Model,JMM):由Java虚拟机规范定义的,用来屏蔽掉java程序在各种不同的硬件和操作系统对内存的访问的差异,这样就可以实现java程序在各种不同的平台上都能达到内存访问的一致性,即屏蔽掉了底层不同计算机的区别。二、缓存一致性缓存是用来解决CPU执行速率和内存(RAM)数据处理速率不一致而产生的,即CPU执行的速度远超内存处理的速度,这就导致了CPU每次读写内存的数据都会浪费很多时间再等待中,于是便有了CPU缓存,CPU缓存处理速率和CP

2021-03-31 15:28:30 60

原创 2021-03-30

上下文切换(多线程不一定是多个线程执行同一个操作(多个线程都执行i++),也可能是同一个时间段内执行不同目的操作(线程一吃饭,线程二喝水))即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现 这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切 换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个 任务。但是,在切换前会保存上一个任务的状

2021-03-31 15:28:09 40

空空如也

空空如也

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

TA关注的人

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