- 博客(21)
- 收藏
- 关注
原创 Java最常见设计模式:单例模式、工厂模式和代理模式
一、设计模式的分类总体来说23种设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。我们主要来了解一下:单例模式(Singleton)简单的工厂模式(Factory)代理模式(Proxy)1. 单例模式
2020-09-26 14:45:11
2876
原创 ReentrantLock 与 synchronized
synchronized同步锁synchronized 它可以把任意一个非 NULL 的对象当作锁。他属于独占式的悲观锁,同时属于可重入锁。Synchronized 作用范围作用于方法时,锁住的是对象的实例(this);当作用于静态方法时,锁住的是Class 实例,又因为Class 的相关数据存储在永久带PermGen(jdk1.8 则是 metaspace),永久带是全局共享的,因此静态方法锁相当于类的一个全局锁,会锁所有调用该方法的线程;synchronized 作用于一个对象实
2020-09-19 19:44:54
267
原创 【二叉树三种遍历顺序】
1、中序遍历指对树中任意节点的访问是在遍历完其左子树后进行的,访问此节点后,再对其右子树遍历(左根右)。遍历从根节点开始,遇到每个节点时,其遍历过程为:中序遍历其左子树;访问根节点;中序遍历其右子树。举例:该树遍历结果:DBHEAFICG2、先序遍历他是指对节点的访问在其左、右子树遍历之前进行的(根左右)。遍历是从根节点开始,遇到每个节点时,其遍历过程为:访问根节点;先序遍历其左子树;先序遍历其右子树举例:该树遍历结果:ABDEHCFIG3、后序遍历它是指左右子树的
2020-09-05 17:10:54
12578
原创 听不懂你打我,MySQL的锁机制就这么简单
MySQL的锁机制相对来说比较简答我们首先要清楚,不同的存储引擎,锁机制也不同:MyISAM:表级锁(table-level locking)MEMORY:表级锁(table-level locking)BDB:页面锁(page-level locking)但也支持表级锁InnoDB(当前主流):既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。我们可以看到上面提到的三种锁机制:(锁机制特性关键词:开销、加锁速度、死锁、粒度、并发性能)锁粒度:锁粒度
2020-08-23 13:57:23
226
原创 锁的四种状态和状态升级
Java中的4种锁状态Java中,针对synchronized有无锁,偏向锁,轻量级锁,重量级锁4种锁状态级别从低到高依次是:无锁 > 偏向锁 > 轻量级锁 > 重量级锁。而且锁的状态只有升级,没有降级。但在学习这4种锁状态前我们得先了解一下这些知识。1.Synchronized为什么能实现线程的同步?这就涉及到两个重要的概念:Java对象头Monitor1.1 Java对象头首先synchronized是一种悲观锁,在操作同步资源前先给同步资源加锁,而加的这把锁是
2020-08-15 15:46:45
979
原创 Spring 和Spring Boot的区别差异
目录Spring 和Spring Boot的区别差异1、Spring2、Spring Boot3、Spring的的不足:4、Spring Boot中的一些特点:5、具体比较5.1、 Maven依赖5.2、MVC配置5.3、配置模板引擎5.4、Spring Security 配置6、应用程序引导配置6.1、Spring 是怎样引导配置的呢?6.2、SpringBoot 是如何配置的呢?7、打包和部署8、结论Spring 和Spring Boot的区别差异1、SpringSpring是一个开放源代码的设
2020-08-08 14:03:43
620
原创 Java的反射机制到底是什么?有什么用?
Java反射机制1、Java 什么是反射机制2、反射能干啥3、怎样得到反射的类4、反射的优缺点1、Java 什么是反射机制Java反射机制是在运行状态中,对于任意一个类,都能知道这个类所有的属性和方法;对于任意一个对象,都能调用任意一个属性和方法;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。通俗的讲:反射就是把Java类中的各个部分,映射成一个个的Java对象,例如,一个类有:成员变量,方法,构造方法,等信息,利用反射技术咱们可以把这些组成部分映射成一个个对象,拿到
2020-08-01 22:51:16
928
原创 Intellij IDEA 如何提升Java开发效率
目录一、快捷键1、查看所有命令和快捷键1、切换页面1、错误定位1、补齐代码1、查找一切1、查看更改1、选择代码1、代码行操作1、测试1、格式化1、重构代码二、Debug最近练习项目开发有些代码写起来比较繁琐枯燥,便罗列了一些当前比较常用实用的快捷键,了解Debug的使用,便于提升开发效率。一、快捷键1、查看所有命令和快捷键Ctrl+Shift+A : 查找所有Intellij的命令,并且每个命令后面还有其快捷键。所以它不仅是一大神键,也是查找学习快捷键的工具。1、切换页面Ctrl+Tab : 切
2020-07-11 18:16:14
521
原创 Java web开发中遇到的问题及解决方法
1、通过数据库连接池,获得查询结果集,但是无法取出数据控制台报错:java.sql.SQLException: Before start of result set出错代码 //获取一个连接 Connection conn = getConnection(); System.out.println("从连接池获取一个连接成功!"); PreparedStatement state = null; ResultSet rs =
2020-07-04 19:58:39
4207
原创 Java Gson和FirstJson详细解析步骤
1、什么是JsonJson全称JavaScript Object Notation,俗称JS对象简谱,是一种轻量级的数据交换格式。格式:键与值之间使用冒号连接, 多个键值对之间使用逗号分隔.键值对的键 应使用引号引住 (通常Java解析时, 键不使用引号会报错. 而JS能正确解析.)键值对的值, 可以是JS中的任意类型的数据例如:{“name”:“金苹果”,“info”:“种苹果”}一个对象, 由一个大括号表示.括号中 描述对象的属性 . 通过键值对来描述对象的属性(可以理解为, 大括号中
2020-06-28 11:12:41
629
原创 非自旋锁VS自旋锁和适应性自旋锁
1、什么是自旋所谓自旋,就是指当有另外一个线程来竞争锁时,这个线程会在原地循环等待,而不是把该线程给阻塞,直到那个获得锁的线程释放锁之后,这个线程就可以马上获得锁的。锁在原地循环的时候,是会消耗cpu的,就相当于在执行一个啥也没有的for循环。自旋其实就是在当前这个线程获取同步资源锁失败的时候,该线程会在原地一直等待锁释放,不会把该线程阻塞,只要获得锁的那个线程释放锁之后,这个等待的线程马上就可以去获得锁。原地循环等待会占用处理器时间的,类似在执行一个空的for循环一样。2、非自旋锁非自旋锁尝试获取
2020-06-20 20:51:02
829
原创 乐观锁和悲观锁详述和应用场景
乐观锁和悲观锁原理和应用场景1、并发控制在多线程出现并发的情况时,为了保证并发情况数据的准确和安全性,就需要通过并发控制保证一个用户的操作不会对另一个用户的操作产生不合理的影响。没有做好并发控制,就可能会导致脏读、幻读和不可重复读等问题。首先要明确:无论是悲观锁还是乐观锁,都是人们定义出来的概念,可以认为是一种思想。2、乐观锁它乐观的认为,在操作数据时,别的线程不会更改数据,所以只是在更新数据前,判断数据是否被别的线程更新过。没有被更新的话,就成功写入;被更新过就放前当前更新操作,可以相对应的做报
2020-06-14 19:06:32
791
原创 可重入锁和非可重入锁剖析
1、可重入锁和不可重入的区别可重入锁也叫递归锁,是在一个线程获取锁后,内部如果还需要获取锁,可以直接获取的锁(前提锁对象得是同一个对象或者class)。不可重入锁也就是相反,线程获取锁后,内部不能再获取锁,由于之前已经获取过还没释放而阻塞,会导致线程死锁。ReentrantLock和synchronized都是重入锁。非可重入锁NonReentrantLock。所以可重入锁的一个优点是可一定程度避免死锁。2、代码示例:我们根据代码来看看:public class Demo2 { pu
2020-06-07 19:10:01
1801
原创 公平锁和非公平锁使用和解析
公平锁和非公平锁在多线程的学习中,发现通过显式锁对线程上锁解决了线程安全问题后,还存在会有线程插队的问题。可能刚出来的线程又马上抢到锁再次插队进入,导致后边的线程一直轮不到,最后线程饿死了的情况发生。问题代码示例:public class DemoReentrantLock { public static void main(String[] args) { //创建一个DemoR对象 Runnable r = new DemoR(); //创建
2020-05-31 15:22:34
1268
原创 Java 解决线程安全问题:上锁
为什么会有线程安全的问题?1、public class Bowl{ //碗数量 private int bowlNumber; public Bowl(int bowlNumber) { this.bowlNumber = bowlNumber; } public int getBowlNumber() { return bowlNumber; } public Bowl() { } //洗碗
2020-05-21 16:53:29
211
原创 Java 线程池
Java 四种线程池的使用1,线程池的作用线程池作用就是限制系统中执行线程的数量。根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果。少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排 队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池 中有等待的工作线程,就可以开始运行了;否则进入等待队列。2,为什么要用线程池?1.减少了创建和销毁线程的次数,每个工
2020-05-21 15:22:12
151
原创 Java 中对Set接口如何实现存储的自定义对象去重
首先我们都知道实现Set不可以存储重复的对象,如果在存储的时候出现了重复的,就不会存入set,实现Set中都是不重复的元素。但我们在实际开发应用中,往往会存储自定义的对象,而该对象很有可能不只一个属性,需求有时候只是需要这个对象中的一个属性或者其中几个做为唯一不重复的属性,意思就是该属性不能重复,其他的属性重复也不会判断为一个对象,这时候我们应该怎么做呢?这就需要来看一下set是怎样来判断对象重复的了:它的底层实际是通过HashCode()生成哈希码,增加元素时先判断哈希码是否相同,不相同就直接之间存
2020-05-16 20:23:40
1454
原创 Java异常处理try catch、throws和throw
关于try catch、throws和throw的用法和使用环境try catch功能:捕获异常。发生了预期内的异常,将其捕获并处理。用法:try{ // 有可能发生异常的代码段}catch(异常类型1 对象名1){ // 异常1的处理操作}catch(异常类型2 对象名2){ // 异常2的处理操作} ...finally{ // 异常的统一出口 //除了前面有关闭程序代码执行以外,不管是否产生了异常,最终都要执行此段代码。}使用情景:throws功能:抛出异常。将类里
2020-05-10 13:15:30
1529
原创 Java关于面向对象的总结
这里写自定义目录标题面向对象基础构造方法方法重载匿名对象包权限修饰符代码块main()面向对象进阶封装关键字面向对象高级继承抽象类概念抽象方法不能被实例化抽象类和普通类的区别接口概念面向接口编程思想全局常量和抽象方法的简写接口的实现 implements接口的继承注意接口和抽象类的区别多态概念多态的体现多态的使用:对象的类型转换instanceofObject类API的使用内部类(了解)包装类可变...
2020-04-25 18:21:32
247
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人