- 博客(152)
- 收藏
- 关注
原创 CAS
乐观锁与悲观锁Synchronized这种独占锁,属于悲观锁。悲观锁始终假定会发生并发冲突,因此会屏蔽一切可能会违反数据完整性的操作。乐观锁假设不会发生并发冲突,因此只在提交操作时检查是否违反数据完整性,如果提交失败,则会进行重试。乐观锁最常见的就是CAS了。CAS(Compare and Swap)是一种高效实现线程安全性的方法支持原子更新操作,适用于计数器,序列发生器等场景属于乐观锁机制,号称lock-freeCAS操作失败时有开发者决定是继续尝试,还是执行别的操作.
2020-09-28 19:56:05 225
原创 volatile
volatile是JVM提供的轻量级同步机制保证被volatile修饰的共享变量对所有线程总是可见的。当一个线程修改了一个被volatile修饰的共享变量时,其他线程能够立即感知到变动 禁止指令重排序优化。使用volatile修饰的变量仍然会存在线程安全的问题如下程序所示,两个线程可能在同一时间读取value值为同一值,对value值进行加1的操作,就会导致线程安全的问题。要解决线程安全的问题,就要在increase方法前加上synchronized关键字。由于synchro..
2020-09-28 19:54:55 326
原创 synchronized底层实现原理
实现synchronized的基础是java对象头和MonitorJava对象头对象在内存中的布局分为三个部分:对象头、实例数据、对齐填充一般来说,synchronized使用的锁对象是存储在Java对象头中对象头结构:对象头是与对象自身定义的数据没有关系的额外存储成本,考虑到JVM的空间效率,Mark Word被设计成非固定的数据结构,以便存储更多有效的数据。它会根据对象本身的状态复用自己的存储空间。Monitor每个Java对象天生自带了一把看不见的...
2020-09-28 19:51:49 357
原创 面试常问题目
JAVAjre和jdk的区别Java环境根据需求分为:开发环境和运行环境。开发环境需要安全JDK,运行环境需要安装JREJDK(Java Development Kit)是Java开发工具集。包含了Java基础类库,Java运行环境(JRE)和Java开发工具,是做Java开发必须安装的。JRE(Java Runtime Environment)指的是Java运行时环境。Java程序运行时必需要JRE的支持。如果系统中安装JRE的话,则意味着系统可以跑Java程序,但是不能进行Java开发。
2020-09-26 15:07:05 307
原创 GC垃圾回收机制
判定对象是否为垃圾的算法?对象被判定为垃圾的标准:没有被其他对象引用判定对象是否为垃圾的算法?1.引用计数算法该算法通过判断对象的引用数量来决定对象是否可以被回收。堆中的每个对象实例都有一个引用计数器,当一个对象被创建时,若对象被分配给一个引用变量,则该对象的引用计数+1;当对象的某个引用变量超过了生命周期或者被设置成一个新值时,该对象的引用计数-1。任何引用计数为0的对象实例可以被当作垃圾收集。优点:由于只需要过滤出引用计数为0的对象,将其内存回收即可,所以算法的执行.
2020-09-22 18:20:03 266
原创 Socket
两个进程如果需要进行通信,就需要唯一的标识一个进程。在本地进程中可以使用pid唯一标识一个进程,但是pid只在本地唯一。IP地址可以唯一标识一台主机,可以使用IP+协议+端口号来唯一标识网络中的一个进程,能够标识网络中的进程后,它们就可以使用Socket进行通信了。Scoket是对TCP/IP协议的抽象,是操作系统对外开放的接口。Scoket通信流程服务器创建Scoket,为Scoket绑定IP地址和端口号,服务器的Scoket就会监听端口号的请求,随时准备接收客户端发来的连接。 客.
2020-08-06 21:20:18 181
原创 HTTPS
https:超文本传输安全协议。在HTTP下加入了SSL层,从而具有了保护数据隐私完整性和提供对网站服务器身份认证的功能。简单来说,他就是安全版的HTTP。SSLSecurity Sockets Layer,安全套接层为网络通信提供安全及数据完整性的一种安全协议位于TCP与各应用层之间,是操作系统对外的API,SSL3.0后更名为TLS。SSL采用身份验证和数据加密保证网络通信的安全和数据的完整性。加密的方式数据在http协议中传输时均采用明文方式传输,这样就会造..
2020-08-06 20:16:06 212
原创 HTTP
超文本传输协议HTTP属于应用层的协议,它是一个基于请求与响应模式的无状态的应用层的协议。HTTP主要特点1.支持客户/服务器模式。HTTP协议工作于客户端/服务端架构之上,http客户端(浏览器)通过url向http服务端(Web服务器)发送请求,Web服务器根据接收到的请求向客户端发送响应信息。2.简单快速。客户端向服务器请求服务的时候,只需传送请求方法和路径。请求方法常用的有get/post,方法规定了服务器与客户端联系的形式不同。由于http协议简单,使得http服务器的规模小,并且通信
2020-08-06 20:15:14 142
原创 UDP简介
UDP报文结构由源端口、目标端口、数据长度、奇偶校验值、用户数据组成UDP的特点1.UDP是一个面向非连接的协议。传输数据之前,源端和终端不建立连接。当它想进行传送时就简单抓取来自应用程序的数据,并尽可能快的把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制。在接收端UDP把每个消息段放在队列中,应用程序每一次从队列中读取一个消息段。2.由于传输不建立连接,因此不需要维护连接状态,一台服务器支持同时向多个客户端传输相同的消息。.
2020-08-06 10:59:39 813
原创 TCP的四次挥手
TCP的四次挥手“挥手”是为了终止连接,TCP四次挥手的流程图如下:客户端程序发送连接释放报文,并且停止发送数据。FNI=1,seq=u(该值为前面传输的数据的最后一个字节序号+1)。客户端进入FIN-WAIT-1终止等待状态。 服务器收到连接释放报文时,向客户端发送确认报文。ACK=1,seq=v,ack=u+1。服务端进入CLOSE-WAIT关闭等待状态。此时处于半关闭的状态,即客户端已经没有数据要发送了,但是服务端还是可以传送数据给客户端。这个状态持续的时间即整个CLOSE-WAI.
2020-08-05 19:46:50 385
原创 TCP的三次握手
IP协议和TCP协议IP协议是无连接的协议,它不会占用两个正在通信的计算之间的通信线路。这样IP就降低了对网络线路的需求,每条线可以同时满足许多不同计算机之间的通信需要。通过IP,消息或者其他数据会被分割为较小的独立的包,并通过因特网在计算机之间传送。IP负责将每个包路由至他的目的地,但IP协议没有做任何的事情来确认数据包是否按顺序发送,或者包是否被破坏,所以IP数据包是不可靠的,需要它的上层协议做出控制。传输控制协议TCP(Transmission Control Protocol)是属于传输层.
2020-08-05 16:41:34 266 1
原创 TCP/IP四层网络模型
OSI是一个定义良好的协议规范集,并有许多可选部分完成类似的任务。它定义了开放系统的层次结构,层次之间的相互关系,以及各层所包括的可能的任务,是作为一个框架来协调和组织各层所提供的服务,但是OSI参考模型并没有提供一个可以实现的方法,而是描述了一些概念,用来协调进程间通信标准的制定。OSI参考模型并不是一个标准,而是一个在制定标准时,所使用的概念型框架。TCP/IP四层架构参考模型,被美国国防部作为计算机网络的标准,可以将它理解为是OSI的一种实现。TCP/IP是利用IP进行通信时所必须用到的协议的统称
2020-08-05 10:51:40 509
原创 网络七层协议 OSI开放式互联参考模型
解决两台物理机之间的通信需求:机器A往机器B发送比特流,机器B能收到这些比特流,这就是物理层要做的事情。物理层主要定义了物理设备的标准,如网线的类型,光纤的接口类型,各种传输介质的传输速率等。它的主要作用是传输比特流,将0101数据转换为电流强弱来进行传输,到达目的机器后再转换为0101的机器码,即数模转换与模数转换。这一层的数据叫做比特,网卡就是工作在这一层的。 在传输比特流的时候,会产生错传或者数据传输不完整的可能,因此数据链路层应运而生。数据链路层定义了如何格式化数据以进行传输,以及如何控制对物理介
2020-08-05 10:31:54 489
原创 JAVA注解
1 注解注解提供一种为程序元素设置元数据的方法。元数据是添加到程序元素如方法、字段、类和包上的额外信息注解是一种分散式的元数据设置方式,XML是集中式的设置方式注解不会直接干扰程序代码的运行所有的注解类都是继承自java.lang.annotation.Annotation接口注解的功能:1.作为特定的标记,用于告诉编译器一些信息(@Override表示方法重写了父类的方法,编译器会去检查是否父类有对应的方法)2.编译时动态处理,如动态生成代码(lombook工具中的@Dat
2020-07-18 10:59:59 182
原创 JAVA反射
1 反射简介反射主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果调整或修改应用所描述行为的状态和相关的语义。核心:允许程序在运行时来进行自我检查并且对内部的成员进行操作反射机制的作用:在运行时判断任意一个对象所属的类在运行时获取类的对象在运行时访问java对象的属性,方法,构造方法等反射类库(java.lang.reflect)主要的类:Field:表示类中的成员变量Method:表示类中的方法Constructor:表示类的构
2020-07-17 21:59:59 249
原创 一个简单例子理解三大工厂模式
1 简单工厂模式定义一个工厂类,根据传入的参数的值不同返回不同的实例特点:被创建的实例具有共同的父类或接口例子:客户端想要获取不同的鼠标类别对象1.鼠标接口以及实现类public interface Mouse { void sayHi();}public class DellMouse implements Mouse{ public void sayHi() { System.out.println("我是戴尔鼠标"); }.
2020-07-17 16:45:06 233
原创 JAVA泛型
1 简介泛型:让数据类型变得参数化定义泛型时,对应的数据类型是不确定的。泛型方法被调用时,会指定具体类型。核心目标:解决容器类型在编译时安全检查的问题。泛型分为三类:泛型类;泛型接口;泛型方法2 泛型类注意:泛型的参数不支持基本类型; 泛型相关的信息不会进入到运行时阶段(在编译的时候就会用具体的数据类型替换掉泛型定义)定义泛型类:import lombok.Data;@Datapublic class GenericClassExample&...
2020-07-17 12:40:10 2575 1
原创 Lombok
Lombok:精简java代码,提高开发人员开发效率的辅助工具。利用注解在编译器自动生成get/set/tostring/构造器等方法Maven中配置依赖<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId>
2020-07-15 12:32:40 180
原创 Slf4j
SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统门面模式可参考:https://blog.csdn.net/qq_31965925/article/details/107355954在Maven中配置依赖<!-- https://mvnrepository.com/artif.
2020-07-15 12:26:41 198
原创 门面模式 Facade Pattern
门面模式:子系统的外部与其内部的通信必须通过统一的对象进行重点:提供一个高层次的接口,使得子系统更易于使用举一个例子:比如我想要建一个房子,我需要找到和泥工,搬砖工,砌墙工,并且需要协调他们之间的工作。使用门面模式,就相当于以上的工作,我只需要找到一个包工头(门面),他来帮我协调好各种工人的工作,我只需要和包工头对接就可以实现:首先实现子系统类//和泥工public class Mason { public void mix() { S
2020-07-15 11:18:25 156
原创 JSP的运行原理
用户访问jsp页面;服务器查找jsp页面;将jsp文件加载到服务器内存中;服务器将jsp页面用java语言的形式翻译成jsp.java文件,同时将jsp.java文件编译成class文件;将class文件加载到内存中去执行;执行class文件,会生成静态的html流,将生成的html文件(静态信息)通过流的形式发送给浏览器已进行展示。查看编译出来的项目源码:Tomcat路径-work-tomcat-localhost-项目名-源码路径,查看源码可以看到jsp页面已经被编译成了一个java文件
2020-07-12 10:55:16 229
原创 使用IDEA构建基于Maven的Web项目
1.创建项目设置Maven的配置文件改变的时候,自动下载新加入的依赖2.引入jsp和servlet相关的依赖maven依赖配置可以到maven的官网查询:https://mvnrepository.com/选择版本进入,复制依赖JSP的依赖查询方式相同最后在Maven中配置<dependencies> <!-- https://mvnrepository.com/artifact/javax.servlet/java
2020-07-12 10:49:08 376
原创 Spring源码的下载、编译、使用
1 源码下载Spring官网:https://spring.io/选择版本:解压源码2 编译源码编译源码可以参考Spring官方文档,源码git下找到1.安装gradleSpring采用的是gradle对代码进行打包的下载地址: https://gradle.org/releases/。下载完整或者二进制都可以。创建目录:C:\Gradle,将下载的压缩包在Gradle文件夹解压。配置环境变量:创建环境变量名:GRAD...
2020-07-11 19:51:15 887
原创 Spring框架简介
1 Spring家族第一阶段:Spring Core--包含AOC IOP等核心模块 Spring Data----连接数据 Spring Security---负责数据安全第二阶段:Spring Boot----使得开发更加便捷第三阶段:Spring cloud---微服务第四阶段:Spring cloud dataflow--组合服务组件2.Spring Core组成1.Core模块整个Spring框架构建在core核心模块中,它是整个框架的基础。在该模块...
2020-07-11 17:14:03 2801
原创 数据库 分解3NF
【例】关系模型R<U,F>,U={A,B,C,D,E},F={A→BC,ABD→CE,E→D}算法一:将关系R转化3NF的保持函数依赖的分解第一步:首先计算出F的最小依赖集(算法详见最小函数依赖),得到F'={A→BC,AD→E,E→D}。第二步:观察U中是否有属性不在F'中的出现,如果有,则这个个属性组成一对关系R,并在原来的U中删除这些属性。而例子中U中的属性都出现在F中,则可以跳过这一步。第三步:对F'中的函数依赖,把左边的相同分为一组,一组中出现的所有属性为一个关系。如F
2020-06-20 19:32:22 5294 2
原创 数据库 范式判断
1NF如果一个关系模式R的所有属性都是不可分的基本数据项,则R为1NF。属性不可拆2NF属性间满足完全依赖,完全依赖是指不能存在仅依赖主键一部分的属性。例设关系模式R(A,B,C,D),函数依赖集F={A->C,C->A,B->AC,D->AC,BD->A}.候选码是BD,确定属于第几范式?第一范式,虽然BD- >A,但是存在B->A,存在部分函数依赖3NF属性不依赖于其他非主属性例如:学生档案表(学号,姓名,年龄,生源地编号,.
2020-06-20 19:31:20 844
原创 数据库 计算最小函数依赖
例7设关系模式R(A,B,C,D),函数依赖集F={A->C,C->A,B->AC,D->AC,BD->A}.求F的最小函数依赖.①将F中的函数依赖都分解为右部为单属性的函数依赖.F={A→C,C→A,B→A,B→C,D→A,D→C,BD→A}②去掉F中冗余的函数依赖.判断A→C是否冗余.设:G1={C→A,B→A,B→C,D→A,D→C,BD→A},得(A)G1+=A(G1是F去掉A->C,求去掉A->C后A的闭包)∵C不属于(A)G1+ ∴ A→..
2020-06-20 19:19:10 1591
原创 数据库 计算候选码
函数依赖闭包计算1.(AE)+ = AE2.因为A->D,E->C,所以 (AE)+=AEDC3.因为CD->I ,所以(AE)+=AEDCI候选码计算例1:R<U,F>,U=(A,B,C,D,E,G),F={AB->C,CD->E,E->A,A->G},求候选码。L:BD R:G LR:ACEX=BD(L类和N类) Y=ACE(LR类)因为BD+=BD,除了G以外(G是属于R,所以一定不...
2020-06-20 19:15:08 1794
原创 脚手架工具 npm与Webpack
npm:一个前端依赖包管理工具,可以使用npm下载项目所需要的依赖包。全称是 Node Package Manager可以参考这篇博客,了解npm是做什么的,https://blog.csdn.net/qq_37696120/article/details/80507178Webpack:Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。从图中我们可以看出,Webpack 可以将多种静态资源 js、css、l
2020-06-19 18:53:36 699
原创 Git常用指令
1.将代码上传到线上git add . 将本地的修改提交到本地的git缓存区git commit -m 'project init' 将本地缓存区的内容提交到本地仓库git push 将本地的代码推到线上去2. 创建和合并分支在远程仓库上创建一个分支在本地执行指令:1.git pull :从远程仓库拉取2.git checkout 分支名称 :切换到这个分支3.在这个分支上添加新的代码4.提交分支代码到远程仓库git add .git co...
2020-06-19 14:55:44 76
原创 Git安装,线上项目与本地项目关联
1.创建线上仓库在码云上创建自己的git仓库码云:https://gitee.com/注册后,在个人主页,仓库处添加一个仓库填写项目信息,即可创建出一个项目2.在本机安装git我的电脑是Windows系统下载:https://git-scm.com/下载的安装包,直接打开,按照提示安装即可。验证是否安装成功:此时点击鼠标右键,就会多一个Git Bash,是Git集成的一个命令行工具,对git的操作可以在这个命令行工具中进行3.配置SSH公钥在桌
2020-06-19 14:10:33 622
原创 JAVA JDBC
如何通过JDBC访问数据库?加载JDBC驱动器。将数据库的JDBC驱动加载到classpath中 加载JDBC驱动,并将其注册到DriverManager中。Class.forName(driverName) 建立数据库连接,取得Connection对象。DriverManager.getConnection(url,username,password) 建立Statement对象或者PreparedStatement对象 执行SQL语句。 访问结果集ResultSet对象。 关闭对象,释放
2020-06-05 21:05:37 180
原创 Spring AOP
什么是AOP?面向切面编程(AOP)是对面向对象开发的一种补充,它允许开发人员在不改变原来模型的基础上动态地修改模型以满足新的需求。比如增加日志,安全,异常处理的功能。Spring支持五种类型的通知:Before(前) org.apringframework.aop.MethodBeforeAdviceAfter-returning(返回后) org.springframework.aop.AfterReturningAdviceAfter-throwing(抛出后) org.spri.
2020-06-05 19:52:33 130
原创 Spring IOC
什么是IOC?控制反转,是一种降低对象之间耦合关系的设计思想。在分层体系中,都是上层调用下层的接口,即调用者依赖于被调用者。通过IOC的方式,采用一定的机制来选择不同的下层实现,使得上层不再依赖于下层的接口,完成控制反转。使用这种方法后,对象不会被显式的调用,而是根据需求通过IOC容器进行依赖注入(DI),IOC通过注入一个实例化的对象来达到解耦和的目的。IOC优点:通过IOC容器,开发人员不需要关注对象是如何被创建的,可以通过配置文件来确定需要注入的实例化对象。同时增加新类也很方便,只需要通过
2020-06-05 19:51:50 239
原创 JAVA线程5 线程操作中的常用函数及区别
Sleep和Wait的区别wait必须写在synchronized的原因在于,当前线程需要获取到锁才可以释放锁当执行sleep()方法的时候,线程不会让出锁,等到sleep时间结束后,线程继续执行但是,执行wait()方法后,线程将锁让出,进入等待队列,别的线程这时候会获取锁,执行notify和notifyAll的区别如果wait没有设置等待时间,程序就会进入无限的等待状态,这时候就需要别的线程去唤醒它调用notifyAll或者notify方法可以达到效果.
2020-06-05 19:47:56 237
原创 JAVA线程4 多线程同步
同步与异步?同步:在多线程中经常会碰到数据的共享问题,即当多个线程访问同一个资源时,需要以某种顺序来确保该资源在某一时刻只能被一个线程使用。要想实现同步操作,必须要获得每一个线程对象的锁。保证在同一时刻只有一个线程能够进入临界区(访问互斥资源的代码块),并且在这个锁被释放之前,其他线程就不能进入该临界区。异步和非堵塞类似,由于每个线程都包含了运行时自身所需要的数据或方法,因此在进行输入输出时,不必关心其他线程的状态或行为。多线程同步的方式有哪些?1.使用synchronized关键.
2020-06-05 19:34:59 182
原创 JAVA线程3 如何实现处理线程的返回值
在线程执行过程中可能会存在一个问题,如下所示:在线程中我们更新了线程对象value的值,因为线程是异步执行的,还未等到线程执行完毕,main函数就输出了value值,此时value的值为null。那么我们如何才能让main函数能够在线程完成后再输出更新后的value值呢??方式1:主线程等待法方式2:使用Thread类的join()阻塞当前线程以等待子线程处理完毕join方法作用:让调用该方法的线程在执行完run()方法后,再执行join方法后面的代码。将两个线程合并,用于实现同步功
2020-06-05 19:24:05 334
原创 JAVA线程2 线程的创建
1 如何实现Java多线程?1.1.继承Thread类,重写run()方法Thread类本质上是实现了Runnable接口的一个实例。Class MyThread extends Thread{ public void run() { System.out.println(“Thread body”); }}public class Test{ public static void main(String[] args){ ...
2020-06-05 16:31:51 146 1
原创 JAVA线程1 线程基础及线程状态
线程与进程?线程是指程序在执行过程中,能够执行程序代码的一个执行单元。线程的状态4种:运行、就绪、挂起、结束。进程是指一段正在执行的程序。一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段、数据段、堆空间)、进程级资源(比如文件),但是各个线程拥有自己的栈空间。使用多线程的好处?使用多线程可以减少程序的响应时间。与进程相比,线程的创建和切换开销更小。多CPU或多核计算机本身就具有执行多线程的能力。使用多线程能简化程序的结构,使程序便于理解和维护。一个复.
2020-06-05 16:19:34 182
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人