自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 《Java核心技术面试精讲》32讲学习总结

第32讲心得该讲介绍了实现安全的 Java 代码。 敏感信息不要被序列化!在编码中,建议使用 transient 关键字将其保护起来。反序列化中,建议在 readObject 中实现...

2021-02-06 19:21:32 235

原创 《Java核心技术面试精讲》31讲学习总结

第31讲心得该讲介绍了Java 应用开发中的注入攻击。 注入式(Inject)攻击是一类非常常见的攻击方式,其基本特征是程序允许攻击者将不可信的动态内容注入到程序中,并将其执行,这...

2021-01-30 17:22:01 156 1

原创 《Java核心技术面试精讲》30讲学习总结

第29讲心得该讲介绍了Java 程序运行在 Docker 等容器环境有哪些新问题。 虽然看起来 Docker 之类容器和虚拟机非常相似,例如,它也有自己的 shell,能独立安装软件...

2021-01-23 11:30:00 579

原创 《Java核心技术面试精讲》29讲学习总结

第29讲心得该讲介绍了JMM。 Java 迫切需要一个完善的 JMM,能够让普通 Java 开发者和编译器、JVM 工程师,能够清晰地达成共识。换句话说,可以相对简单并准确地判断出,...

2021-01-15 17:25:20 125

原创 《Java核心技术面试精讲》28讲学习总结

第28讲心得该讲介绍了 GC 调优思路。 对于 GC 调优来说,首先就需要清楚调优的目标是什么?从性能的角度看,通常关注三个方面,内存占用(footprint)、延时(latency...

2021-01-08 19:40:45 84

原创 《Java核心技术面试精讲》27讲学习总结

第27讲心得该讲介绍了Java 常见的垃圾收集器。 于对象实例收集,主要是两种基本算法,引用计数和可达性分析。引用计数算法,顾名思义,就是为对象添加一个引用计数,用于记录对象被引用的...

2021-01-03 21:53:50 132

原创 《Java核心技术面试精讲》26讲学习总结

第26讲心得该讲介绍了何监控和诊断 JVM 堆内和堆外内存使用。 堆内存内部结构随着 JVM 的发展和新 GC 方式的引入,可以有不同角度的理解。新生代是大部分对象创建和销毁的区域,...

2020-12-25 19:06:35 205

原创 《Java核心技术面试精讲》25讲学习总结

第25讲心得该讲介绍了JVM 内存区域的划分,哪些区域可能发生 OutOfMemoryError。 程序计数器(PC,Program Counter Register)。在 JVM...

2020-12-18 18:57:31 223

原创 《Java核心技术面试精讲》24讲学习总结

第24讲心得该讲介绍了哪些方法可以在运行时动态生成一个 Java 类。我们可以从常见的 Java 类来源分析,通常的开发过程是,开发者编写 Java 代码,调用 javac 编译成 class 文件,然后通过类加载机制载入 JVM,就成为应用运行时可以使用的 Java 类了。从上面过程得到启发,其中一个直接的方式是从源码入手,可以利用 Java 程序生成一段源码,然后保存到文件等,下面就只需要解决编译问题了。有一种笨办法,直接用 ProcessBuilder 之类启动 javac 进程,并指定上面生

2020-12-11 19:09:29 351

原创 《Java核心技术面试精讲》23讲学习总结

第22讲心得该讲介绍了类加载过程,什么是双亲委派模型?。一般来说,我们把 Java 的类加载过程分为三个主要步骤:加载、链接、初始化,具体行为在Java 虚拟机规范里有非常详细的定义。首先是加载阶段(Loading),它是 Java 将字节码数据从不同的数据源读取到 JVM 中,并映射为 JVM 认可的数据结构(Class 对象),这里的数据源可能是各种各样的形态,如 jar 文件、class 文件,甚至是网络数据源等;如果输入数据不是 ClassFile 的结构,则会抛出 ClassFormatE

2020-12-04 19:32:08 144

原创 《Java核心技术面试精讲》22讲学习总结

第22讲心得该讲介绍了AtomicInteger 底层实现原理是什么?如何在自己的产品代码中应用 CAS 操作?。AtomicIntger 是对 int 类型的一个封装,提供原子性的访问和更新操作,其原子性操作的实现是基于 CAS(compare-and-swap)技术。所谓 CAS,表征的是一些列操作的集合,获取当前数值,进行一些运算,利用 CAS 指令试图进行更新。如果当前数值未变,代表没有其他线程进行并发修改,则成功更新。否则,可能出现不同的选择,要么进行重试,要么就返回一个成功或者失败的结果

2020-11-29 14:52:00 127

原创 《Java核心技术面试精讲》21讲学习总结

第21讲心得该讲介绍了Java 并发类库提供的线程池。通常开发者都是利用 Executors 提供的通用线程池创建方法,去创建不同配置的线程池,主要区别在于不同的 ExecutorService 类型或者不同的初始参数。Executors 目前提供了 5 种不同的线程池创建配置:newCachedThreadPool(),它是一种用来处理大量短时间工作任务的线程池,具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;如果线程闲置的时间超过 60 秒,则被终止并移出缓存

2020-11-22 15:38:25 356

原创 《Java核心技术面试精讲》19到20讲学习总结

第17讲心得该讲介绍了Java 并发包提供的并发工具类。java.util.concurrent 及其子包,集中了 Java 并发的各种基础工具类,具体主要包括几个方面:提供了比 synchronized 更加高级的各种同步结构,包括 CountDownLatch、CyclicBarrier、Semaphore 等,可以实现更加丰富的多线程操作,比如利用 Semaphore 作为资源控制器,限制同时进行工作的线程数量。各种线程安全的容器,比如最常见的 ConcurrentHashMap、有序的 Co

2020-11-13 18:12:01 275

原创 《Java核心技术面试精讲》17到18讲学习总结

第17讲心得该讲介绍了线程的生命周期和状态转移。Java 的线程是不允许启动两次的,第二次调用必然会抛出 IllegalThreadStateException,这是一种运行时异常,多次调用 start 被认为是编程错误。关于线程生命周期的不同状态,在 Java 5 以后,线程状态被明确定义在其公共内部枚举类型 java.lang.Thread.State 中,分别是:新建(NEW),表示线程被创建出来还没真正启动的状态,可以认为它是个 Java 内部状态。就绪(RUNNABLE),表示该线程已经在

2020-11-07 17:41:47 319

原创 《Java核心技术面试精讲》13到14讲学习总结

第13讲心得该讲介绍了ynchronized 和 ReentrantLock有什么区别。synchronized 是 Java 内建的同步机制,所以也有人称其为 Intrinsic Locking,它提供了互斥的语义和可见性,当一个线程已经获取当前锁时,其他试图获取的线程只能等待或者阻塞在那里。在 Java 5 以前,synchronized 是仅有的同步手段,在代码中, synchronized 可以用来修饰方法,也可以使用在特定的代码块儿上,本质上 synchronized 方法等同于把方法全部

2020-11-01 18:31:51 210

原创 《Java核心技术面试精讲》13到14讲学习总结

第13讲心得该讲介绍了接口和抽象类有什么区别。接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的。接口,不能实例化;不能包含任何非常量成员,任何 field 都是隐含着 public static final 的意义;同时,没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。Java 标准类库中,定义了非常多的接口,比如 java.util.List。抽象类是不能实例化的类,用 abstract 关键字修饰 class,其目的主要是代码重用。除了不能实例化

2020-10-23 17:42:09 145

原创 《Java核心技术面试精讲》11到12讲学习总结

第11讲心得该讲介绍了Java 提供了哪些 IO 方式? NIO 如何实现多路复用。Java IO 方式有很多种,基于不同的 IO 抽象模型和交互方式,可以进行简单区分。首先,传统的 java.io 包,它基于流模型实现,提供了我们最熟知的一些 IO 功能,比如 File 抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。java.io 包的好处是代码比较简单、直观,缺点则是 IO 效率

2020-10-17 10:47:27 191

原创 《Java核心技术面试精讲》9到10讲学习总结

第9讲心得该讲介绍了Hashtable、HashMap、TreeMap 有什么不同。Hashtable 是早期 Java 类库提供的一个哈希表实现,本身是同步的,不支持 null 键和值,由于同步导致的性能开销,所以已经很少被推荐使用。HashMap 是应用更加广泛的哈希表实现,行为上大致上与 HashTable 一致,主要区别在于 HashMap 不是同步的,支持 null 键和值等。通常情况下,HashMap 进行 put 或者 get 操作,可以达到常数时间的性能,所以它是绝大部分利用键值对.

2020-10-11 19:09:54 140

原创 《Java核心技术面试精讲》7到8讲学习总结

第5讲心得该讲介绍了int 和 Integer 有什么区别。int 是我们常说的整形数字,是 Java 的 8 个原始数据类型(Primitive Types,boolean、byte 、short、char、int、float、double、long)之一。Java 语言虽然号称一切都是对象,但原始数据类型是例外。Integer 是 int 对应的包装类,它有一个 int 类型的字段存储数据,并且提供了基本操作,比如数学运算、int 和字符串之间转换等。在 Java 5 中,引入了自动装箱和自动拆

2020-09-25 20:45:02 102

原创 《Java核心技术面试精讲》5到6讲学习总结

第5讲心得该讲介绍了String、StringBuffer、StringBuilder。String 是 Java 语言非常基础和重要的类,提供了构造和管理字符串的各种基本逻辑。它是典型的 Immutable 类,被声明成为 final class,所有属性也都是 final 的。也由于它的不可变性,类似拼接、裁剪字符串等动作,都会产生新的 String 对象。由于字符串操作的普遍性,所以相关操作的效率往往对应用性能有明显影响。StringBuffer 是为解决上面提到拼接产生太多中间对象的问...

2020-09-19 16:42:23 133

原创 《Java核心技术面试精讲》3到4讲学习总结

第3讲心得该讲介绍了final、finally、 finalize。final 可以用来修饰类、方法、变量,分别有不同的意义,final 修饰的 class 代表不可以继承扩展,final 的变量是不可以修改的,而 final 的方法也是不可以重写的(override)。finally 则是 Java 保证重点代码一定要被执行的一种机制。我们可以使用 try-finally 或者 try-catch-finally 来进行类似关闭 JDBC 连接、保证 unlock 锁等动作。finalize 是.

2020-09-10 17:12:41 149

原创 《Java核心技术面试精讲》1到2讲学习总结

第1讲心得该讲介绍了Java平台。Java 本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”(Write once, run anywhere),能够非常容易地获得跨平台能力;另外就是垃圾收集(GC, Garbage Collection),Java 通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。 “Java 是解释执行”这句话不太准确。我们开发的 Java 的源代码,首先通过 Javac 编

2020-09-05 21:26:56 290

原创 《Java并发编程实战》41到45讲学习总结

第41讲心得该讲介绍了高性能数据库连接池HiKariCP。数据库连接池和线程池一样,都属于池化资源,作用都是避免重量级资源的频繁创建和销毁,对于数据库连接池来说,也就是避免数据库连接频繁创建和销毁。 执行数据库操作基本上是一系列规范化的步骤:通过数据源获取一个数据库连接;创建 Statement;执行 SQL;通过 ResultSet 获取 SQL 执行结果;释放 ResultSet;释放 Statement;释放数据库连接。 //数据库连接池配置HikariConfig config =

2020-08-29 20:48:37 170

原创 《Java并发编程实战》36到40讲学习总结

第36讲心得该讲介绍了Guarded Suspension模式。一个对象 GuardedObject,内部有一个成员变量——受保护的对象,以及两个成员方法——get(Predicate<T> p)和onChanged(T obj)方法。其中get() 方法用来实现等待,参数 p 就是用来描述这个前提条件的;onChanged() 方法可以 fire 一个事件,而这个事件往往能改变前提条件 p 的计算结果。 class GuardedObject<T>{ //受保护的

2020-08-22 19:59:34 125

原创 《Java并发编程实战》31到35讲学习总结

第31讲心得该讲介绍了Fork/Join。Fork 对应的是分治任务模型里的任务分解,Join 对应的是结果合并。Fork/Join 计算框架主要包含两部分,一部分是分治任务的线程池 ForkJoinPool,另一部分是分治任务 ForkJoinTask。。 ForkJoinTask 是一个抽象类,它的方法有很多,最核心的是 fork() 方法和 join() 方法,其中 fork() 方法会异步地执行一个子任务,而 join() 方法则会阻塞当前线程来等待子任务的执行结果。ForkJoinTas

2020-08-15 10:29:19 119

原创 《Java并发编程实战》26到30讲学习总结

第26讲心得该讲介绍了Fork/Join。Fork 对应的是分治任务模型里的任务分解,Join 对应的是结果合并。Fork/Join 计算框架主要包含两部分,一部分是分治任务的线程池 ForkJoinPool,另一部分是分治任务 ForkJoinTask。。 ForkJoinTask 是一个抽象类,它的方法有很多,最核心的是 fork() 方法和 join() 方法,其中 fork() 方法会异步地执行一个子任务,而 join() 方法则会阻塞当前线程来等待子任务的执行结果。ForkJoinTas

2020-08-08 13:18:45 135

原创 《Java并发编程实战》21到25讲学习总结

第21讲心得该讲介绍了原子类。Java SDK 并发包将无锁方案封装提炼之后,实现了一系列的原子类。其实原子类性能高的秘密很简单,硬件支持而已。CPU 为了解决并发问题,提供了 CAS 指令(CAS,全称是 Compare And Swap,即“比较并交换”)。CAS 指令包含 3 个参数:共享变量的内存地址 A、用于比较的值 B 和共享变量的新值 C;并且只有当内存中地址 A 处的值等于 B 时,才能将内存中地址 A 处的值更新为新值 C。作为一条 CPU 指令,CAS 指令本身是能够保证原子性的

2020-08-01 08:15:39 130

原创 《Java并发编程实战》16到20讲学习总结

第16讲心得该讲介绍了局部变量为什么是安全的。每个方法在调用栈中都有自己独立的空间,称为栈帧。每个栈帧中都有方法需要的参数和返回地址。调用方法时会创建新的栈帧并压入调用栈;方法返回时对应的栈帧就被自动弹出。也就是说,栈帧是和方法同生共死的。 局部变量的作用域是方法内部,也就是说局部变量也是和方法同生共死的。事实上,局部变量也放入了栈帧中。 两个线程可以用不同的参数调用同一个方法,那么线程和调用栈是什么关系呢?每个线程都有自己的调用栈,局部变量保存在各自的调用栈中。由于局部变量不会共享,所以没有并

2020-07-26 19:17:38 105

原创 《Java并发编程实战》11到15讲学习总结

第11讲心得该讲介绍了局部变量为什么是安全的。每个方法在调用栈中都有自己独立的空间,称为栈帧。每个栈帧中都有方法需要的参数和返回地址。调用方法时会创建新的栈帧并压入调用栈;方法返回时对应的栈帧就被自动弹出。也就是说,栈帧是和方法同生共死的。 局部变量的作用域是方法内部,也就是说局部变量也是和方法同生共死的。事实上,局部变量也放入了栈帧中。 两个线程可以用不同的参数调用同一个方法,那么线程和调用栈是什么关系呢?每个线程都有自己的调用栈,局部变量保存在各自的调用栈中。由于局部变量不会共享,所以没有并

2020-07-19 09:28:26 123

原创 《Java并发编程实战》6到10讲学习总结

第6讲心得本讲介绍了等待-通知机制:当线程需要的条件不满足时,可以将线程阻塞,当满足条件时再进行通知,从而避免了轮询操作对CPU的消耗。Java 语言内置的 synchronized 配合 wait()、notify()、notifyAll() 这三个方法可以快速实现等待-通知机制。 当一个线程进入临界区后,由于某些条件不满足,需要进入等待状态,Java 对象的 wait() 方法就能够满足这种需求。 当条件满足时调用 Java 对象的 notify()方法会通知等待队列中的线程,告诉它条件曾经

2020-07-11 15:34:52 179

原创 《Java并发编程实战》1到5讲学习总结

第1讲心得第1讲介绍了产生并发编程Bug的原因:缓存导致的可见性问题、线程切换带来的原子性、编译优化带来的有序性问题。为了均衡CPU和内存的速度差异,CPU引入了缓存的概念。在多核时代,每个CPU都有自己的缓存,多个线程操纵的CPU缓存是不同的,因此一个线程对共享变量的修改对另一个线程可能不是立即可见的。 通过让每个进程每次只执行一个时间片的时间操作系统做到了分时复用。进程间做任务切换需要切换内存映射地址,而线程间切换避免了切换内存映射地址的开销,因此现代操作系统都在线程间进行任务调度。

2020-07-04 14:47:24 309

空空如也

空空如也

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

TA关注的人

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