自定义博客皮肤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)
  • 收藏
  • 关注

原创 Java并发编程学习(10):线程池、饥饿现象

自定义线程池class ThreadPoolTest{ public static void main(String[] args){ RejectPolicy<Runnable> rejectPolicy = BlockingQueue::put; MyThreadPool pool = new MyThreadPool(3, 1000, TimeUnit.MILLISECONDS, 4, rejectPolicy); for (int

2021-07-06 10:57:41 437

原创 Java并发编程学习(9):不可变对象、final原理

以String类为例在java中,String是我们平时用到的最常见的不可变类之一,这里我们以String类为例,看看不可变类的设计。在String类的开头部分如下,我们可以看到String类被final修饰,同时其成员变量value也被final修饰。public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is u

2021-07-01 15:42:10 152

原创 Java并发编程学习(8):CAS机制、原子变量

示例引入我们需要执行一个高并发削减账户余额的逻辑。为方便起见,我们将账户类设计为一个抽象类,并且只对中的静态demo()方法进行了实现。在demo()方法中,我们会生成若干线程,每个线程执行同样的逻辑:扣除账户中的余额。当全部线程执行完毕后,方法会打印账户的余额数量以及执行程序的用时。abstract class Account{ abstract String getName(); abstract int getBalance(); abstract void wi

2021-06-11 20:07:44 229

原创 Java并发编程学习(7):线程安全与反序列化安全的单例模式

单例模式单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。特点单例模式有 3 个特点:单例类只有一个实例对象;该单例对象必须由单例类自行创建;单例类对外提供一个访问该单例的全局访问点。优缺点单例模式的优点:单例模式可以保证内存里只有一个实例,减少了内存的开销。可以避免对资源的多重占用。单例模式

2021-06-03 12:01:24 241 1

原创 Java并发编程学习(6):可见性、有序性

Java内存模型概念Java内存模型(Java Memory Model, JMM),它定义了主存、工作内存的抽象概念,底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。体现原子性:保证指令不会受到线程上下文切换的影响可见性:保证指令不会受到CPU缓存的影响有序性:保证指令不会受到CPU并行优化的影响原子性Monitor主要关注的是访问共享变量时,保证了临界区代码的原子性可见性现象:不会停下来的循环在下面的代码中,变量run初始值为true,1秒后,主线程将其修改为fals

2021-06-02 16:10:29 102

原创 Java并发编程学习(5):死锁、可重入锁、控制线程顺序

死锁要点一个线程需要同时获取多把锁,这是就容易发生死锁,例如:t1线程获得A对象的锁,接下来想获得B对象的锁t2线程获得B对象的锁,接下来想获得A对象的锁代码示例public class DeathLockDemo { public static void main(String[] args) { Object a = new Object(); Object b = new Object(); Runnable task1= ()

2021-05-28 15:55:51 158

原创 Java并发编程学习(4):生产者消费者、线程状态转换

生产者-消费者模型要点生产者仅负责产生数据结果,不关心数据如何处理消费者专心处理数据结果消息队列可以用来平衡生产者与消费者的线程资源消息队列有容量限制,满时不会再加入数据JDK中各种阻塞队列,采用的就是这种模式代码示例消息队列消息队列是模型中核心组成部分,控制着入队和出队逻辑。消息队列存在容量上线,当消息队列满时,如果有线程希望继续向队列中添加消息,则会进入等待状态;同理,当消息队列为空时,如果有线程希望继续从队列中取出消息,也会进入等待状态。因此,再完成向消息队列中存入/取出消

2021-05-27 09:51:36 82

原创 Java并发编程学习(3):Monitor、wait-notify与保护性暂停

JVM中的MonitorJava 对象头在Hotspot中一个Java对象包含如下三个部分:对象头实例信息对齐信息vm对象头信息是与对象自身定义的数据无关的额外存储的信息,由于它存在于对象中,jvm规范中安装对象类型,分两种类型:普通对象包含:Mark Word、Klass Pointer(元数据指针)数组对象包含:Mark Word、Klass Pointer(元数据指针)、Array Length在不同JVM下,对象头每一部分占用的内存并不相同数据含义32位JVM

2021-05-18 17:34:38 185

原创 Java并发编程学习(2):synchronized的使用与线程安全类

问题引入在下面的代码中,两个线程操作了同一个变量count,其中一个线程执行自增,另一个线程执行自减,且各自均执行5000次。直观感受上,变量count的最终结果应该为0,但事实并非如此。static Integer count = 0;public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { for (int i = 0; i &

2021-05-14 21:03:59 78

原创 Java并发编程学习(1):线程的创建、启动、常用方法与线程的状态

概念进程与线程进程程序由指令和数据组成,当一个程序被运行,从磁盘加载这个程序的的代码到内存,这是就开启了一个进程进程可以视为程序的一个实例线程一个进程之类可以分为一个或多个线程一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给CPU执行两者对比Java中,线程作为最小的调度单位,进程作为资源分配的最小单位在Windows中进程是不活动的,只是作为线程的容器进程基本上相互独立,而线程存在于进程内,是进程的一个子集进程拥有共享的资源,如内存空间,供其内部的线程共享

2021-05-12 17:12:04 154

原创 Leetcode错题集-Q1723-完成所有工作的最短时间

原题描述LeetCode第1723题 完成所有工作的最短时间难度:困难给你一个整数数组jobs,其中 jobs[i]是完成第i项工作要花费的时间。请你将这些工作分配给 k位工人。所有工作都应该分配给工人,且每项工作只能分配给一位工人。工人的 工作时间 是完成分配给他们的所有工作花费时间的总和。请你设计一套最佳的工作分配方案,使工人的 最大工作时间 得以 最小化 。返回分配方案中尽可能 最小 的 最大工作时间我的思路错误思路我最初打算使用贪心算法来解决此问题,后来发现该方法并不能得到最终解。贪

2021-05-08 17:02:42 240

原创 Java中split()函数返回空字符串的笔记

split()函数的基本功能根据给定正则表达式的匹配拆分此字符串。先观察一些现象请先阅读代码,并预测代码的结果。第一段代码 public static void main(String[] args) { String s = "aba"; String[] strings = s.split("b"); System.out.println("strings.length = " + strings.length); for

2021-05-07 16:16:42 1620

原创 Leetcode错题集-Q403-青蛙过河

原题描述LeetCode第403题 青蛙过河难度:困难一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一块石子上)。开始时, 青蛙默认已站在第一块石子上,并可以假定它第一步只能跳跃一个单位(即只能从单元格 1 跳至单元格 2 )。如果青蛙上一步跳跃了k个单位,那么它接下来的跳跃距离只能选

2021-04-29 19:32:15 206

原创 Java中的IO模式(BIO、NIO、AIO)

Java的IO演进java网络编程的三种IO模型:BIO、NIO、AIOBIO特点:同步并阻塞实现模式:一个连接一个线程具体细节:当客户端有连接请求时,服务器会单独启动一个线程进行处理,这个线程是同步的缺点:如果连接不做任何事情的话,会造成不必要的线程开销使用场景:连接数量较小,架构固定NIO支持:JDK1.4特点:同步非阻塞实现模式:多个连接一个线程具体细节:当客户端有连接请求时,其请求会被注册到多路复用器上,多路复用器轮询到连接有IO请求就会进行处理使用场景:连接数量较多,连接

2021-04-23 16:54:06 542

原创 Leetcode错题集-Q341-扁平化嵌套列表迭代器

原题描述LeetCode第341题 扁平化嵌套列表迭代器难度:中等给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。列表中的每一项或者为一个整数,或者是另一个列表。其中列表的元素也可能是整数或是其他列表。相关类// This is the interface that allows for creating nested lists.// You should not implement it, or speculate about its implementa

2021-03-23 17:31:08 100

原创 Leetcode错题集-Q20-有效的括号

原题描述LeetCode第20题 有效的括号难度:简单给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合我的思路创建一个栈,并依次遍历整个字符串:当遇到左括号时,就将其压入栈;当遇到右括号时,就将栈顶元素弹出,检查是否能与右括号匹配。如果不能匹配,,可以提前中止循环,返回fasle。当遍历完数组发现全部匹配时,可以返回true。我的尝试第一次class

2021-03-15 22:07:35 113 2

原创 新世代垃圾回收器

新世代垃圾回收器(学习笔记)7种垃圾回收器的变化情况GC仍然处于飞速发展之中,目前的默认选项G1 GC在不断的进行改进,很多我们原来认为的缺点,例如串行的Full GC、Card Table扫描的低效等,都已经被大幅改进,例如,JDK10以后,Fu11GC已经是并行运行,在很多场景下,其表现还略优于ParallelGC的并行Ful1GC实现。即使是SerialGC,虽然比较古老,但是简单的设计和实现未必就是过时的,它本身的开销,不管是GC相关数据结构的开销,还是线程的开销,都是非常小的,所以随着云计

2021-03-08 22:22:16 170

原创 JVM-GC日志分析

GC日志分析(学习笔记)查看GC的常用参数参数含义备注-XX:+PrintGC输出GC日志类似-verbose:gc,JDK9中被替换为-Xlog:gc-XX:+PrintGCDetails输出GC详细日志JDK9中被替换为-Xlog:gc*-XX:+PrintGCTimeStamps输出GC的时间戳以基准时间的形式,JDK9中为-Xlog:gc(*)::uptime(默认打开)-XX:+PrintGCDateStamps输出GC的时间戳以日期的形

2021-03-08 21:41:56 7101

原创 G1垃圾回收器

G1垃圾回收器(学习笔记)G1的问世为什么要推出G1?由于应用程序所应对的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序的正常运行,而经常造成STW的GC有跟不上实际的需求,所以才会不断对GC进行优化。G1(Garbage-First)垃圾回收器是在Java7 update4之后引入的一个新的垃圾回收器,是当今收集器技术发展的最前沿成果之一。与此同时,为了适应现在不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间(pause time),同时兼顾良好的吞吐量。官方给G1设定

2021-03-08 11:36:33 148

原创 CMS垃圾回收器

CMS垃圾回收器简介CMS全称Concurrent-Mark-Sweep。在JDK1.5时期,HotSpot推出了一款在强交互应用中有划时代意义的垃圾收集器,这款收集器是HotSpot中第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程和用户线程同时工作。CMS的垃圾收集算法采用标记-清除算法,也会STW。CMS作为老年代垃圾收集器,却无法与新生代中收集器Parallel Scavenge配合工作。G1出现之前,CMS的使用非常广泛。主要环节CMS的整个过程分为4个阶段:初始标记、并

2021-03-05 17:35:57 136

原创 Parallel Scavenge垃圾回收器

Parallel与Parallel Old收集器(学习笔记)简介全称为Parallel Scavenge收集器。HotSpot中,除了ParNew收集器是基于并行回收以外,Parallel Scavenge同样也采用了复制算法、并行回收和STW机制。Parallel Scavenge的目标是达到一个可控制的吞吐量。自适应调节策略也是Parallel Scavenge和ParNew的一个重要区别。高吞吐量则可以高效利用CPU时间,尽快完成运算任务,主要适合在后台运算而不需要太多交互的场景。批量

2021-03-04 21:35:29 535 1

原创 ParNew垃圾回收器

ParNew垃圾回收器(学习笔记)基本概念ParNew收集器是Serial收集器的多线程版本。Par是Parallel的缩写New表示只能处理新生代ParNew收集器再新生代中仍然采用复制算法、STW机制。ParNew是很多JVM运行再Server端的默认垃圾回收器。对于新生代,回收器次数频繁,使用并行方式高效。对于老年代,回收次数少,使用串行节省资源(这CPU切换线程)。ParNew一定比Serial更好吗?多CPU场景下,ParNew可以充分利用多CPU、多核心的物理硬件优势,

2021-03-04 20:21:20 194 1

原创 Serial与Serial Old垃圾回收器

Serial与Serial Old垃圾回收器(学习笔记)Serial收集器Serial收集器是最基本、你是最悠久的垃圾收集器。JDK1.3之前回收新生代的唯一选择。Serial收集器是HotSpot中Client模式下默认的新生代垃圾收集器。Serial收集器采用复制算法、串行回收、STW机制的方式进行内存回收。Serial Old收集器同时,除了新生代之外,Serial收集器还提供用于执行老年代内存回收的Serial Old收集器。Serial Old收集器采用标记-压缩算法、串行回收、ST

2021-03-04 17:33:34 307 1

原创 JVM-垃圾回收器分类

垃圾回收器分类(学习笔记)GC分类垃圾收集器没有在规范中进行过多规定,可以由不同厂商、不同版本的JVM来实现。串行回收与并行回收串行回收是指在同一时间段内只允许由一个CPU用于执行垃圾回收操作,此时工作线程暂停,直到垃圾回收工作结束。在诸如单CPU处理器或者较小的引用内存的场合,串行回收器的性能可以超过并行回收器和并发回收器。所以,串行回收模式某人被应用在客户端的Client模式下的JVM中在并发能力比较强的CPU上,并行回收器的停顿时间要短于串行回收器并行回收可以使用多个CPU同时执行垃

2021-03-02 22:06:55 134 1

原创 JVM-垃圾回收相关概念

垃圾回收相关概念System.gc() 的理解在默认情况下,通过System.gc()或者Runtime.getRuntime.gc()的调用,会显示除法Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然后System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。一般情况下,垃圾回收是自动进行的,无需手动触发。在一些特殊情况下,如我们正在编写一个性能测试,我们可以在测试之前调用System.gc()。理解不可达对象的回收例子1:public void

2021-03-01 22:23:36 128

原创 JVM-垃圾回收算法

垃圾回收算法(学习笔记)垃圾回收算法概述垃圾回收算法可以分为两个阶段:标记阶段和清除阶段。标记阶段:区分内存中存活和死亡的对象,并对死亡的对象进行标记清楚阶段:将标记的对象清除出内存 死亡的对象是指没有被任何存活的对象所引用的对象标记阶段算法:引用计数算法可达性分析算法清除阶段算法:标记-清除算法复制算法标记-压缩算法引用计数算法对于每一个对象,都保留一个整形的引用计数器属性。用于记录对象被引用的情况。例如:对于一个对象A,当有其他对象引用A时,A的引用计数器就

2021-02-27 16:51:07 115 1

原创 JVM-垃圾回收概述

JVM垃圾回收什么是垃圾垃圾是指在运行程序中没有任何指针指向的对象。注意:基本数据类型不会成为垃圾,因为它们会随着出栈而消失。为什么需要GC如果不进行垃圾回收,内存迟早都会被消耗完除了释放没用的对象,垃圾回收也可以清除内存内的记录碎片,这样便于JVM将内存整理出的内存分配给新的对象应用程序说应付的业务越来越大,没有GC就不能保证应用程序的正常进行。而经常造成STW的GC有跟不上实际的需求,因此需要不断地优化GC早期的垃圾回收开发人员可以使用new关键字进行内存申请,并使用delete关

2021-02-26 17:03:17 86

空空如也

空空如也

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

TA关注的人

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