自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 并发-自定义线程池

Thread Pool:放置这些可以重用的线程Blocking Queue:阻塞队列,体现生产者-消费者模式下,平衡它们之间速度差异线程池中的线程相当于任务的消费者,main线程相当于任务的生产者。

2023-08-17 17:30:49 33 1

原创 并发-ReentrantLock详解

synchronized中也有条件变量,就是waitSet,但ReentrantLock支持多个条件变量。一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获得这把锁。ReentrantLock默认是不公平的,可以通过构造方法设置。如果是不可重入的,第二次获得锁的时候会被锁挡住。为了避免死等,减少死锁,属于被动避免。相对synchronized。

2023-08-17 17:28:38 33 1

原创 并发-共享模型-无锁

性能提升的原因:在竞争时,设置多个累加单元,Thread-0累加Cell[0],而Thread-1累加Cell[1]…但无锁情况下,因为线程要保持运行,需要额外CPU的支持,虽然不会进入阻塞,但由于没有分到时间片,仍然会进入可运行状态,还会导致上下文切换。,即使重试失败,线程始终在高速运行没有停歇,而synchronized会让线程在没有获得锁的时候发生上下文切换,进入阻塞。利用字段更新器,可以针对对象的某个域(Field)进行原子操作,只能配合 volatile 修饰的字段使用,否则会出现 异常。

2023-08-17 17:27:59 24 1

原创 并发-JAVA内存模型解析及volatile原理

它用来修饰成员变量和静态成员变量,他可以避免线程从自己的工作缓存中查找该变量的值,必须到主存中获取它的值,线程操作volatile变量都是直接操作主存,解决可见性问题。JMM定义了主存(所有线程都共享的数据)和工作内存(每个线程都私有的数据)抽象概念,底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。读屏障(lfence)保证在该屏障之后,对共享变量的读取,加载的是主存中的最新数据(保证可见性 )写屏障(sfence)保证在该屏障之后,对共享变量的改动,都同步到主存中(保证可见性)

2023-08-17 17:26:20 37 1

原创 并发-深入分析synchronized

如果尝试加轻量级锁的过程中,CAS操作无法成功,这时一种情况就是有其他线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁。当退出synchronized代码块(解锁时)如果有取值为null的锁记录,表示有重入,这时重置锁记录,表示重入计数减一。当退出synchronized代码块时,锁记录的值不为null,这时使用CAS将MarkWord的值恢复给对象头。轻量级锁对使用者是透明的,语法仍是synchronized,会优先使用轻量级锁加锁,如果加锁失败才会用重量级锁。

2023-08-17 17:24:55 42 1

原创 并发-Monitor详解

每个Java对象都可以关联一个Monitor对象(操作系统提供的),如果使用synchronized给对象上锁(重量级)之后,该对象头的Mark Word中就被设置指向Monitor对象的指针。Monitor被翻译为。Monitor结构如下。

2023-08-17 17:20:44 40 1

原创 并发-线程运行原理剖析

当Context Switch发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,java中就是用程序计数器完成,它记住下一条jvm指令的执行地址。用setDaemon()设置守护进程,垃圾回收器就是一种守护进程,java应用结束了,垃圾回收线程也会停止。只要等其他的非守护线程运行结束了,即使守护进程的代码没有执行完,也会强制结束。因为以下一些原因导致cpu不再执行当前的线程,转而执行另一个线程的代码。打断正常运行的线程,不会清空打断状态。打断park线程,不会清空打断状态。

2023-08-17 17:17:58 37 1

原创 并发-创建线程的多种方式

在runable传入Thread对象时,Thread里面的run方法,会判断如果有runnable对象,会优先采用runnable对象的run方法;用Runnable更容易和线程池等高级API配合,且让任务类脱离了Thread继承体系,更灵活。把【线程】和【任务】(线程要执行的任务代码)分开。

2023-08-17 17:15:50 24 1

原创 JVM-HotSpot对象揭秘

并不是必然存在的,它仅仅起占位符的作用,由于HotSpot虚拟机的自动内存管理系统起始地址必须是8字节的整数倍,任何对象的大小都必须是8字节的整数倍,对象头已经被设计为8字节的整数倍,而对象填充是在实例数据部分没有对齐时来填充的。部分是对象真正存储的有效信息,在程序代码中定义的各种类型的字段内容,无论是父类继承的还是子类定义的;对象在堆内存中的存储布局可以分为:对象头(Header)、实例数据(Instance Data)和对象填充(Padding)是否已经被加载、解析、初始化过。

2023-08-16 18:07:50 26

原创 JVM-深入剖析JVM内存区域

本机直接内存的分配不会受到堆大小的限制,但是,会受到本机总内存(包括物理内存、SWAP分区或者分页文件)大小以及处理器寻址空间的限制,一般服务器管理员配置虚拟机参数时,会根据实际内存去设置-Xmx等参数信息,但经常忽略掉直接内存,使各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制),从而导致动态扩展时出现OOM异常。,java并不要求常量一定只有编译期才能产生,并不是预置入Class文件中常量池的内容才可以进入方法区运行时常量池,运行期间也可以将新的常量放入池中,用的比较多的就是。

2023-08-16 18:05:42 19 1

原创 JVM-调优

由此可见,Web应用需要一个对应用造成暂停时间短的GC,再加上大部分Web应用的瓶颈都不在CPU上,因为对于Web应用而言,在G1不够成熟的情况下,CMS GC是不错的选择。-Xmn适用于调整新生代的大小,新生代的大小决定了多少比例的对象有机会在minor GC阶段被回收掉,但此值相应的也决定了老年代的大小;新生代越大,通常意味着多数对象会在minor GC阶段被回收掉,但同时也决定了老年代的空间会变小,可能会造成更频繁的Full GC,甚至是OOM。由于GC动作会挂起应用线程,严重影响性能。

2023-08-16 18:04:03 16 1

原创 JVM-执行引擎详解

只要能被invokestatic和invokespecial指令调用的方法,都可以在解析阶段中确定唯一的调用版本,java中符合这个条件的方法有静态方法、私有方法、实例构造器、父类方法四种,再加上被final修饰的方法(尽管它被invokevirtual调用),这5种方法调用会。所有方法调用的目标方法在Class文件中都是一个常量池中的符号引用,在类加载的解析阶段,会将其中的一部分符号引用转化为直接引用,这种解析能成立的前提是:方法在程序。,用于存放方法参数和方法内部定义的局部变量。

2023-08-16 18:01:51 32 1

原创 JVM-什么是双亲委派模型?

这个类不在JAVA_HOME/lib/中,而是位于jar包的META-INF/services/目录里,所以说这块的类加载实际上Bootstrap Class Loader是无法进行加载的,他需要Application Class Loader来完成加载,但原则上这是不被允许的,因为破坏了双亲委派机制。,每一次都是如此,因此所有的请求最后都会传到最顶层,然后再去加载,如果顶层反馈无法完成这个加载请求(它的搜索范围中没有找到所需的类),就会给下一层的子类去找,一层一层下去尝试完成加载;

2023-08-16 17:59:21 25 1

原创 JVM-内存分配和回收策略详解

对象通常在Eden区产生,如果经过了一次minorGC后仍然存活,该对象会被移动到Survivor空间且将年龄设为1岁;对象在Survivor区每熬过一次minorGC,年龄就加1岁,当年龄加到一定程度(默认为15),就会晋升到老年代中;大部分情况,对象优先在Eden区分配,当Eden区内存不够分配时,虚拟机将发起一次Minor GC;设置值是否允许担保失败,如果允许,会继续检查老年代最大可用的连续空间。,如果大于,会尝试进行一次MinorGC,虽然有风险,但是风险很小;如果不大于,虚拟机会检查参数。

2023-08-16 17:56:36 24 1

原创 JVM-由浅入深分析经典垃圾收集器

G1收集器之所以能够建立可预测的停顿时间模型,是应为它将Region作为单次回收的最小单元,即每次回收的内存空间都是Region大小的整数倍,这样可以有计划的避免整个java堆进行全区域的GC;:G1的停顿预测模型是以**衰减均值(Decaying Average)**来实现的,GC过程中,G1会记录每个Region的回收耗时、每个Region记忆集中的脏卡数量等各个可测量的步骤话费的成本,并分析得出平均值、标准偏差、置信度等统计信息。但是随着处理器核心的增加,其对GC时系统资源的高效利用还是很有好处的;

2023-08-16 17:37:12 27

原创 JVM-深入解析垃圾回收算法

HotSpot虚拟机Eden区和Survivor区的大小比例是8:1,也就是说新生代可以用的内存空间是整个新生代空间的90%,但是并不能百分百保证10%的空间够放存活的对象(其实绝大部分情况是够了),但是Appel式回收还对这里做了一个处理,当MinorGC后Survivor区放不下存活的对象时,就需要依赖其他的内存(一般这里就是老年代,因为MinorGC存活下来的对象很可能会进入老年代)进行。如果剩下的都是难以消亡的对象,虚拟机就可以用较低的频率去回收这个区域,这样就同时兼顾了时间开销和内存有效利用。

2023-08-16 17:29:06 46 1

原创 基于session实现登录

基于session实现登录

2022-11-03 22:28:05 92 2

原创 瑞吉外卖项目 Springboot+mybatisplus

基于springboot+mybatisplus+vue+elementui 适合新手练手项目

2022-07-22 10:21:02 874 1

空空如也

空空如也

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

TA关注的人

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