自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 什么是运行时数据区

5、程序计数器(PC寄存器)程序计数器中存放的是当前线程所执行的字节码的行数。程序计数器(PC寄存器)程序计数器中存放的是当前线程所执行的字节码的行数。3、栈解决的是程序运行的问题,栈里面存的是栈帧,栈帧里面存的是局部变量表、操作数栈、动态链接、方法出口等信息。2、方法区可以认为是堆的一部分,用于存储已被虚拟机加载的信息,常量、静态变量、即时编译器编译后的代码。4、本地方法栈与栈功能相同,本地方法栈执行的是本地方法,一个Java调用非Java代码的接口。

2024-06-06 19:28:28 104

原创 什么是虚拟机栈

Machine Stack):早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用,是线程私有的。3.作用:主管Java程序的运行,保存方法的局部变量,部分结果,并参与方法的调用和返回。2.生命周期:和线程的生命周期是一致的。1.Java虚拟机栈(Java。

2024-06-06 19:21:09 123

原创 JVM由那些部分组成,运行流程是什么

2 运行时数据区把字节码加载到内存 (字节码文件只是JVM的一套指令集规范,并不能直接交给底层系统去执行,而是有执行引擎去执行)3.执行引擎将字节码翻译成底层指令,再交由CPU区执行,此时需要调用其他语言的本地库接口来实现整个程序的功能。1 先是类加载子系统 把Java 代码转换为字节码。

2024-06-06 19:05:33 207

原创 synchronized和Lock有什么区别 ?

Lock 提供了很多synchronized不具备的功能,如获取等待的状态,公平锁,可打断,可超时,多条件变量。synchronized是关键字,源码在jvm(虚拟机)由c++语言来实现。synchronized退出同步代码块时会释放锁,而Lock需要手动释放锁。在没有竞争时 synchronized做了很多优化,如偏向锁,轻量级锁。Lock 是接口,源码由jdk提供,用java语言实现。在竞争激烈时,Lock 的实现通常会提供更好的性能。两者都属于悲观锁 都有互斥,锁重入,同步。

2024-05-17 17:12:10 92

原创 讲一下synchronized关键字的底层原理

其中waitset是关联处于waiting状态的线程,entryList关联的是出于阻塞状态的线程,owner是关联得到锁的线程,并且只能关联一个线程。它的底层由monitor实现的,monitor是jvm级别的对象,线程获取锁需要关联monitor。synchronized(对象锁)采用互斥的方式让同一时刻只允许一个线程所占用。monitor由waitset,entryList,owner三个属性组成。

2024-05-15 20:15:32 70

原创 在 java 中 wait 和 sleep 方法的不同

共同点:wait(),wait(long),sleep(long)都是使当前线程失去对CPU的使用权,进入阻塞队列。2.wait(),wait(long)可以notify被唤醒,wait()如果没有唤醒,会一直等下去。wait(),wait(long) 是属于Object对象的成员方法,每个对象都有。1.wait(long),sleep(long)都是等待相应毫秒后醒来。wait方法调用先获取wait对象锁才可以使用,sleep没有限制。wait方法执行后会释放锁,允许其他线程获取锁。

2024-05-15 20:10:13 107

原创 新建 T1、T2、T3 三个线程,如何保证它们按顺序执行?

t2.join();// 加入线程t2,只有t2线程执行完毕以后,再次执行该线程。t1.join();// 加入线程t1,只有t1线程执行完毕以后,再次执行该线程。为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。可以使用线程类中的join方法在一个线程中启动另一个线程,等另一个线程执行完之后该进程继续执行。

2024-05-15 17:02:29 323

原创 面试题-说一下HashMap的实现原理?

jdk1.8 使用数组+链表+红黑树 注意 是当链表长度大于8 且数组长度大于64 链表会转为红黑树,如果在扩容时红黑树节点等于小于6则会退化为链表。4. 当我们获取时,直接找到hash值对应的下标,再进一步判断下标下的key是否相同,如果相同则返回该值,否在返回null;2.当我们往hashMap里面put元素时,利用key的hashCode来计算当前对象的元素在数组中的下标。b 当下标相同 ,且key不相同 key-vlaue放入红黑树或者链表中。1. HashMap数据结构是数组+链表+红黑树。

2024-05-14 20:02:44 196 2

原创 ArrayList和LinkedList的区别是什么

查找(未知索引):因为ArrayList和LinkedList都需要遍历 他们的查询时间复杂度都是O(n)ArrayList尾部插入和删除,时间复杂度是O(1);其他部分增删需要挪动数组,时间复杂度是O(n)LinkedList头尾节点增删时间复杂度是O(1),其他都需要遍历链表,时间复杂度是O(n)LinkedList 是双向链表需要存储数据,有两个指针,更占用内存。ArrayList底层是数组,内存连续,节省内存。ArrayList和LinkedList都不是线程安全的。

2024-05-14 17:21:23 130 1

原创 如何实现数组和List之间的转换

数组转List 用 Arrays.asLint方法 数组内容改变 List内容也跟着改变 原因底层使用的是Arrarys类中的一个内部类来构造集合的,在各个构造器总我们只是包装一下这个集合,指向的还是同一个地址。Lint转数组 用list.toArrary方法 List内容改变 数组内容不会影响 因为底层用的是数组拷贝,之间没有关系。

2024-05-14 17:15:52 77 2

原创 ArrayList list=new ArrayList(10)中的list扩容几次

该语句只是声明和实例了一个ArrayList 指定容量为10 ,没有扩容。

2024-05-14 17:09:56 222 2

原创 线程池的原理

2024-05-12 16:14:27 75

原创 线程池核心参数

unit:时间单位,为keepAliveTime指定时间单位。maximumPoolSize:线程池能创建线程最大的个数。threadFactory: 创建线程的工程类。workQueue:阻塞队列,用于保存任务的阻塞队列。corePoolSize:核心线程池的大小。keepAliveTime:空闲线程。handler:饱和策略(拒绝策略)

2024-05-12 15:48:25 58

原创 线程池的分类

3. newSingleThreadExecutor :创建一个使用单 worker线程的Executor,以无界队列方式来运行这个线程,线程池中只能执行一个线程,之后提交的线程将会排在队列中等待执行。2. newFixedThreadPool :创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,线程池中的线程处于一定的量,可以很好的控制线程的并发量。5. newScheduledThreadPool:创建一个线程池,它可安排在给定延迟后运行 命令或者定期的执行。

2024-05-12 15:20:34 130

原创 Hashmap和hashtable ConcurrentHashMap区别

HashTable 使用的是 Synchronized 关键字修饰,ConcurrentHashMap 是 JDK1.7 使用了锁分段技术来保证线程安全的。synchronized 只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就 不会产生并发,效率又提升N倍。4. HashTable是同步的,HashMap不是,所以HashMap适合单线程,HashTable适合多线程,但是由于HashTable内部优化不好也不会使用它作为多线程使用。

2024-05-12 10:31:18 110

原创 Hashmap的底层原理

2. 当newHashMap():底层没有创建数组,首次调用put()方法示时,底层创建长度 为16的数组,jdk8底层的数组是:Node[],用数组容量大小乘以加载因子得 到一个值,一旦数组中存储的元素个数超过该值就会调用rehash方法将数组容量增加到原来的2^x倍,专业术语叫做扩容,在做扩容的时候会生成一个新的数组,原来的所有数据需要 重新计算哈希码值重新分配到新的数组,所以扩容的操作非常消耗性能。如果所有的equals方 法返回都是false,那么这个新的节点将被添加到链表的末尾。

2024-05-11 20:38:42 303 1

原创 synchronized 和 Lock 有什么区别

用synchronized 关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程 等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果 尝试获取不到锁,线程可以不用一直等待就结束了;synchronized 的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平 (两者皆可);Lock 锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。synchronized 无法判断获取锁的状态 Lock可以判断是否获取到锁。

2024-05-11 09:35:29 90 1

原创 synchronized 和 volatile 的区别是什么

volatile 仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证 变量的修改可见性和原子性。synchronized则可以使用在变量、方法、和类级别的。volatile 标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从 主存中读取;synchronized可能会造成线程的阻塞。则是锁定当前变量,只有当前线程可以访问该变量,其他线 程被阻塞住。

2024-05-11 09:21:11 97 1

原创 synchronized 底层实现原理

可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进 入到临界区,同时它还可以保证共享变量的内存可见性。 静态同步方法,锁是当前类的class对象。 普通同步方法,锁是当前实例对象。 同步方法块,锁是括号里面的对象。

2024-05-11 09:08:12 68 1

原创 同步锁、死锁、乐观锁、悲观锁

总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是 在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和 CAS 算法实现。: 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时 候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使 用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了 很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

2024-05-11 08:41:47 171 1

原创 ThreadLocal 的原理

ThreadLocal 本身并不存储值,它只是作为一个 key保存到ThreadLocalMap 中,但是这里要注意的是它作为一个key用的是弱引用,因为没有强引用链,弱引用在GC 的时候可能会被回收。其实在ThreadLocal 类中有一个静态内部类ThreadLocalMap(其类似于Map), 用键值对的形式存储每一个线程的变量副本,ThreadLocalMap中元素的key为当前 ThreadLocal 对象,而value对应线程的变量副本。通过threadlocal保证线程的安全性。

2024-05-10 22:08:53 143

原创 BIO、NIO、AIO 有什么区别?

AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO , 异步 IO 的操作基于事件和回调机制。NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简 单使用方便,并发处理能力低。

2024-05-10 21:46:37 73

原创 Java 的异常

都是RuntimeException类及其子类异常,如 NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等, 这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序 逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。:表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重 错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶 多只能显示错误信息。

2024-05-10 21:42:34 240

原创 jdk1.8 的新特性

之前的 JDK 自带的日期处理类非常不方便,我们处理的时候经常是使用的第三方 工具包,比如 commons-lang 包等。这种风格将要处理的元素集 合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选, 排序,聚合等。有且仅有一个抽象方法的接口叫做函数式接口,函数式接口可以被隐式转换为 Lambda 表达式。通过管道化的操作,我们可以对数据流进行复杂的处理,而不必编写复杂的循环和条件逻辑。2 .方法引用 方法引用允许直接引用已有 Java 类或对象的方法或构造方法。

2024-05-10 21:36:01 742

原创 面向对象的特征

同而采用多种不同的行为方式(发送消息就是函数调用)。抽象:表示对问题领域概念进行分析,中。但是本质上相同的具体概念的抽象。修饰类时,此类就不能被实例化。

2024-05-10 20:25:26 140

转载 Redis

Sentinel的三个作用是什么?集群监控故障恢复状态通知Sentinel如何判断一个redis实例是否健康?每隔1秒发送一次ping命令,如果超过一定时间没有相向回复则认为是主观下线(sdown如果大多数sentinel都认为实例主观下线,则判定服务客观下线(odown故障转移步骤有哪些?首先要在sentinel中选出一个leader,由leader执行failover选定一个slave作为新的master,执行,切换到master模式然后让所有节点都执行slaveof新master。

2024-05-09 12:55:59 4

原创 Spring Task

1.cron 表达式:是一个字符串,通过它可以自定义任务触发的时间。构成规则:分为6/7个域,由空格隔开,每一个域代表一个含义。每一个域的含义分别为:秒,分钟,小时,日,周,月,年(可选)日和周二选一 空的用?

2024-02-01 17:03:17 345 1

空空如也

空空如也

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

TA关注的人

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