自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Mysql有哪几种锁?

1.表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发最低。2.行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。3.页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定力度界于表锁和行锁之间,并发度一般。...

2022-02-21 22:10:21 1282

原创 请列举Nginx的一些特性

Nginx服务器的特性包括:反向代理/L7负载均衡器嵌入式Perl解释器动态二进制升级可用于重新编写URL,具有非常好的PCRE支持

2022-01-09 09:12:17 673

原创 static存在的主要意义

static的主要意义是在于创建独立于具体对象的域变量或者方法。 以致于即使没有创建对象,也能使用属性和调用方法 !static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能 。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在st

2022-01-06 09:05:24 439

原创 this与super的区别

super:它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)super()和this()类似,区别是,super()在子类中调用父类的构造方法,this()在本类内调用本类的其它构造方法。super()和this()均需放在构

2022-01-05 19:17:16 77

原创 跟 Synchronized 相比,可重入锁 ReentrantLock 其实现原理有什么不同?

其实,锁的实现原理基本是为了达到一个目的: 让所有的线程都能看到某种标记。 Synchronized 通过在对象头中设置标记实现了这一目的,是一种 JVM 原生的锁实现方式,而 ReentrantLock 以及所有的基于 Lock 接口的实现类,都是通过用一个 volitile 修饰的 int 型变量,并保证每个线程都能拥有对该 int 的可见性和原子修改,其本质是基于所谓的 AQS 框架。...

2022-01-05 11:45:00 442

原创 乐观锁一定就是好的吗?

乐观锁避免了悲观锁独占对象的现象,同时也提高了并发性能,但它也有缺点:1. 乐观锁只能保证一个共享变量的原子操作。如果多一个或几个变量,乐观锁将变得力不从心,但互斥锁能轻易解决,不管对象数量多少及对象颗粒度大小。2. 长时间自旋可能导致开销大。假如 CAS 长时间不成功而一直自旋,会给 CPU 带来很大的开销。3. ABA 问题。CAS 的核心思想是通过比对内存值与预期值是否一样而判断内存值是否被改过,但这个判断逻辑不严谨,假如内存值原来是 A,后来被一条线程改为 B,最后又被改成了 A,则 C

2022-01-04 21:30:00 565

原创 请尽可能详尽地对比下 Synchronized 和 ReentrantLock 的异同

ReentrantLock 是 Lock 的实现类,是一个互斥的同步锁。从功能角度,ReentrantLock 比 Synchronized 的同步操作更精细(因为可以像普通对象一样使用),甚至实现 Synchronized 没有的高级功能,如: 等待可中断:当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,对处理执行时间非常长的同步块很有用。 带超时的获取锁尝试:在指定的时间范围内获取锁,如果时间到了仍然无法获取则返回。  可以判断是否有线程在排队等待获取锁。 可以

2022-01-04 20:24:49 354

原创 为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有什么特性?

Synchronized 显然是一个悲观锁,因为它的并发策略是悲观的: 不管是否会产生竞争,任何的数据操作都必须要加锁、用户态核心态转换、维护锁计数器和检查是否有被阻塞的线程需要被唤醒等操作。 随着硬件指令集的发展,我们可以使用基于冲突检测的乐观并发策略。先进行操作,如果没有其他线程征用数据,那操作就成功了; 如果共享数据有征用,产生了冲突,那就再进行其他的补偿措施。这种乐观的并发策略的许多实现不需要线程挂起,所以被称为非阻塞同步。 乐观锁的核心算法是 CAS(Compareand Swap,比较并交换),

2022-01-04 16:45:00 697

原创 Java线程数过多会造成什么异常

1)线程的生命周期开销非常高2)消耗过多的CPU资源如果可运行的线程数量多于可用处理器的数量,那么有线程将会被闲置。大量空闲的线程会占用许多内存,给垃圾回收器带来压力,而且大量的线程在竞争CPU资源时还将产生其他性能的开销。3)降低稳定性JVM在可创建线程的数量上存在一个限制,这个限制值将随着平台的不同而不同,并且承受着多个因素制约,包括JVM的启动参数、Thread构造函数中请求栈的大小,以及底层操作系统对线程的限制等。如果破坏了这些限制,那么可能抛出OutOfM emory Error异常...

2022-01-03 20:36:14 2540

原创 什么是锁消除和锁粗化?

锁消除:指虚拟机即时编译器在运行时,对一些代码上要求同步,但被检测到不可能存在共享数据竞争的锁进行消除。主要根据逃逸分析。 程序员怎么会在明知道不存在数据竞争的情况下使用同步呢?很多不是程序员自己加入的。锁粗化:原则上,同步块的作用范围要尽量小。但是如果一系列的连续操作都对同一个对象反复加锁和解锁,甚至加锁操作在循环体内,频繁地进行互斥同步操作也会导致不必要的性能损耗。 锁粗化就是增大锁的作用域。...

2022-01-03 11:30:00 1330

原创 static关键字五连问

1.抽象的(abstract)方法是否可同时是静态的(static)?抽象方法将来是要被重写的,而静态方法是不能重写的,所以这个是错误的。2.是否可以从一个静态(static)方法内部发出对非静态方法的调用?不可以,静态方法只能访问静态成员,非静态方法的调用要先创建对象。3.static 可否用来修饰局部变量?static 不允许用来修饰局部变量4.内部类与静态内部类的区别?静态内部类相对与外部类是独立存在的,在静态内部类中无法直接访问外部类中变量、方法。如果 要访问的话,必

2022-01-03 08:15:00 120

原创 hsahCode()和equals()的区别

从两个方面介绍他们的区别:一个是性能,一个是可靠性。1.equals()既然已经能实现对比的功能了,为什么还要hashCode()呢?因为重写的equals()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高。2.hashCode()既然效率这么高为什么还要equals()呢?因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以has

2022-01-02 20:09:18 124

原创 为什么说 Synchronized 是非公平锁?

非公平主要表现在获取锁的行为上,并非是按照申请锁的时间前后给等待线程分配锁的,每当锁被释放后,任何一个线程都有机会竞争到锁,这样做的目的是为了提高执行性能,缺点是可能会产生线程饥饿现象。...

2022-01-02 12:00:00 550

原创 JVM 对 Java 的原生锁做了哪些优化?

在 Java 6 之前,Monitor 的实现完全依赖底层操作系统的互斥锁来实现。由于 Java 层面的线程与操作系统的原生线程有映射关系,如果要将一个线程进行阻塞或唤起都需要操作系统的协助,这就需要从用户态切换到内核态来执行,这种切换代价十分昂贵,很耗处理器时间,现代 JDK 中做了大量的优化。 一种优化是使用自旋锁,即在把线程进行阻塞操作之前先让线程自旋等待一段时间,可能在等待期间其他线程已经解锁,这时就无需再让线程执行阻塞操作,避免了用户态到内核态的切换。 现代 JDK 中还提供了三种不同的 Moni

2022-01-01 11:45:00 198

原创 什么是可重入性,为什么说 Synchronized 是可重入锁?

可重入性是锁的一个基本要求,是为了解决自己锁死自己的情况。· 对 Synchronized 来说,可重入性是显而易见的,在执行 monitorenter 指令时,如果这个对象没有锁定,或者当前线程已经拥有了这个对象的锁(而不是已拥有了锁则不能继续获取),就把锁的计数器 +1,其实本质上就通过这种方式实现了可重入性。...

2021-12-31 08:30:00 616

原创 你刚才提到获取对象的锁,这个“锁”到底是什么?如何确定对象的锁?

锁”的本质其实是 monitorenter 和 monitorexit 字节码指令的一个 Reference 类型的参数,即要锁定和解锁的对象。我们知道,使用 Synchronized 可以修饰不同的对象,因此,对应的对象锁可以这么确定。1. 如果 Synchronized 明确指定了锁对象,比如 Synchronized(变量名)、Synchronized(this) 等,说明加解锁对象为该对象。2. 如果没有明确指定: 若 Synchronized 修饰的方法为非静态方法,表示此方法对应的对象为

2021-12-30 08:30:00 765

原创 Synchronized 用过吗,其原理是什么?

Synchronized 是由 JVM 实现的一种实现互斥同步的一种方式,如果你查看被 Synchronized 修饰过的程序块编译后的字节码,会发现,被 Synchronized 修饰过的程序块,在编译前后被编译器生成了 monitorenter 和 monitorexit 两个字节码指令。这两个指令是什么意思呢?在虚拟机执行到 monitorenter 指令时,首先要尝试获取对象的锁: 如果这个对象没有锁定,或者当前线程已经拥有了这个对象的锁,把锁的计数器 +1;当执行 monitorexit

2021-12-29 21:50:03 242

原创 抽象类和接口有什么异同?

接口和抽象类有什么异同?抽象类:1.抽象类中可以定义构造器2.可以有抽象方法和具体方法3.接口中的成员全都是 public 的4.抽象类中可以定义成员变量5.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法6.抽象类中可以包含静态方法7.一个类只能继承一个抽象类接口:1.接口中不能定义构造器2.方法全部都是抽象方法3.抽象类中的成员可以是 private、默认、protected、public4.接口中定义的成员变量实际上都是常量5.接口中不能有静态方法6.一个类可以

2021-10-31 17:25:47 123

原创 集合框架 Set List Map

Set 无序,不支持相同内容,会被覆盖,移除set.remove(),set.toArray()集合转数组。List 有序,元素内容可以重复,长度大小可以改变;list.add()和list.addAll()不同:List list=new ArrayList();list.add(list);把集合当成一个元素添加到list中;list.addAll(list);把集合中的元素添加到list中。addFirst(),addLast()是LinkedList特有的,同样removeF

2021-09-30 00:10:55 55

原创 面向接口编程开发打印机墨盒:彩色,黑白纸张类型:A4,B5墨盒和纸张都不是打印机厂商提供的打印机厂商要兼容市场上的墨盒,纸张

开发打印机墨盒:彩色,黑白 纸张类型:A4,B5 墨盒和纸张都不是打印机厂商提供的 打印机厂商要兼容市场上的墨盒,纸张墨盒接口package org.cc.demo1;public interface InkBox { public String color();}黑色package org.cc.demo1;public class BlackBox implements InkBox{ @Override public String color() {

2021-09-28 10:00:00 1765

原创 IO流的相关

装饰器模式分为输入流和输出流有两种方式1.基于字节流,操作字节(二进制)inputStream读取,outputStream写入2.字符流,操作文本,Reader读取,Writer写入,注意:两个对应,一个桥梁。对应是Byte Stream到Char Stream,输入流到输出流。桥梁是字节流到字符流的转换。Java的IO主要包含三个部分:1.流式部分——IO的主体部分2.非流式部分——主要包含一些辅助流式部分的类3.文件读取部分的与安全相关的类以及与本地操作系统相关的文

2021-09-27 19:04:28 32

原创 Java异常

java异常java中用来抛出异常的关键字是throw;一旦程序运行,异常将被创建;Exception类是所有异常类的父类;java语言中,try{…}子句是异常处理的出口;自定义异常类时,可以继承的类是Exception及其子类;在异常处理中,将可能抛出异常的方法放在(try)语句块中;对于try{……}catch子句的排列方式,子类异常在前,父类异常在后;使用catch(Exception e)的好处是捕获try语句块中产生的所有类型的异常;所有的异常类皆继承java.lang.Thr

2021-09-26 21:11:29 804

原创 抽象类和接口

抽象类和接口抽象类针对的类,接口针对的是行为或方法。抽象类什么是抽象类?没有足够的信息去描述的类。抽象类中可以没有抽象方法。如果一个类(子类)继承抽象类(父类),父类有抽象方法的时候,子类必须去重写父类的抽象方法。如果说这个子类不重写这个抽象方法,意味着这个子类也是个抽象类。接口是标准和规范,是一种约定。接口里写的是未实现的类和常量。接口没有构造方法,和抽象类一样,不能创建自己的对象。接口可以继承接口,也可以多继承。...

2021-09-23 14:02:22 43

空空如也

空空如也

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

TA关注的人

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