![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java基础
文章平均质量分 72
少年做自己的英雄
奋斗吧 少年
展开
-
synchronized到底锁的是谁、何时生效
synchronized锁的几种形式,及各种形式下的举例及验证。下面看一个稍微复杂的场景,main方法中启动两个线程,func1和func2均被synchronized修饰。由于是非静态方法,锁的是当前对象data,由于func1和func2方法都被synchronized修饰,且在main方法中,是用的new出来的同一个data进行调用,于是锁的就是这个data,用到data发生资源抢占,需要排队。代码首先执行到func1,func1执行3秒,func2排队等待三秒后,执行func2。原创 2022-10-26 23:03:58 · 873 阅读 · 0 评论 -
JVM类加载机制
前言 java秉承“一次编写,到处运行”的理念,其平台无关系得益于JVM(Java虚拟机)的存在,其并不仅仅与java语言绑定,而是与“Class”文件(字节码文件)所关联,任何可以编译成Class文件的语言都可以被JVM识别。 Class文件中的信息,最终都要加载到JVM中才能运行和使用,Java语言中,类型的加载、连接、初始化均在程序运行期间完成,为其反射即动态扩展提供了支持。 因此,一个.java文件到最终被执行,一共经历了两个阶段: 1. 编译:从.java文件通过java编译器原创 2021-10-24 22:39:55 · 121 阅读 · 0 评论 -
HashMap链表成环(JDK1.7)原因及源码分析
触发条件JDK1.7 HashMap扩容 多线程同时扩容源码分析假设当前数组长度3(仅仅是假设,实际应该是2的n次方),其中一个bucket位置首次put 1,如图扩容发生在put元素超出阈值情况下,源码从put方法入手当扩容时,在put方法中,首先根据hashcode计算出所需插入新元素应当在数组中的什么位置(bucket),因此相同的hashcode意味着相同的bucket,就需要解决冲突。 for循环去遍历这个bucket,bucket可能是空的,也可能存在Entry...原创 2021-10-20 00:07:46 · 1411 阅读 · 2 评论 -
线程池如何实现的线程复用及源码分析
目录线程池创建流程图源码分析总结【精华】常见问题线程池创建流程图源码分析线程池核心类:ThreadPoolExecutor,其构造方法维护了很多线程池关键参数,比如:corePoolSize、workQueue、handler等等,其都是ThreadPoolExecutor类的成员变量。public ThreadPoolExecutor(int corePoolSize, int maximumPoolSi.原创 2021-09-01 00:37:01 · 353 阅读 · 0 评论 -
Java可重入锁及其如何避免死锁
定义可重入锁,也叫递归锁。“重入”将获取锁的粒度由“调用”转变为“线程”,即当一个线程请求一个未持有的锁,该线程将顺利得到锁并被记录,且将计数值从0变为1;当下次同一个线程再次请求这把锁,该线程无需排队,而是直接得到锁,且计数值由1变为2,仅仅是数量上的累加;每次退出一个线程,计数值-1,直到计数值为0,这把锁将被释放。因此重入锁的原理:当某个线程请求一个由其他线程持有的锁,该线程将被阻塞。synchronized及ReentainLockJava中内置锁synchronized及Ree原创 2021-08-22 14:38:48 · 1592 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier
CountDownLatchJDK1.5被引入,在java.util.concurrent包下,其初始化一个数值(>=0),使用countDown将计数器数值减1,使用awit方法阻塞线程。当计数器数值为0时,解除阻塞。常用方法:public CountDownLatch(int count) // 构造方法:初始化计数器数量public void await() // 阻塞线程public boolean await(long timeout, TimeUnit unit)原创 2021-08-22 14:03:28 · 134 阅读 · 0 评论 -
Java NIO
Java磁盘数据读取模型数据存在磁盘中,磁盘控制器从磁盘中读取将其放入操作系统内核的缓冲区,然后Java程序从缓冲区中读取数据由于现在CPU处理速度的上升,整体的运行速度瓶颈已不在CPU,更多的是由I/O效率决定,而目前市面上所有操作系统已经将I/O性能改善到非常OK不会拖后腿,但由于Java虚拟机为了提供一个多系统统一的环境,其单方面屏蔽了操作系统在I/O上处理的优化。是JVM在I/O方面效率不足,导致的程序效率降低。在操作系统中,可以从硬件上直接读取大块的数据,而JVM只能从这些大块的.原创 2021-08-21 16:54:23 · 103 阅读 · 0 评论 -
Java线程通信及线程虚假唤醒
线程在内部运行时,线程调度具有一定的透明性,程序通常无法控制线程的轮换执行。但Java本身提供了一些机制来保证线程协调运行。假设目前系统中有两个线程,分别代表存款和取钱。原创 2021-06-14 20:42:14 · 190 阅读 · 1 评论 -
HashMap的桶位为什么是2的N次方(源码分析----1.8)
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; No.原创 2021-06-06 19:05:43 · 242 阅读 · 2 评论 -
jdk8新特性:方法引用
方法引用可以继续简写Lambda,使代码更紧凑,引入操作符::当接口的抽象方法入参和返回值,与此接口实例化时内部调用方法的入参和返回值一致,则可以使用方法引用简写。例如:Consumer<String> consumer = str -> System.out.print(str);构造器引用:Class::newSupplier<String> supplierOld = () -> new String();Supplier<Stri原创 2021-05-12 23:39:00 · 103 阅读 · 0 评论 -
jdk8新特性:函数式接口
函数式接口:只包含一个抽象方法的接口。其可以包含多个默认方法、类方法,但抽象方法只能有一个。因此一个函数式接口的实例可用匿名内部类形式来表示,而匿名内部类在jdk8中可被Lambda表达式代替。【Lambda表达式介绍参照我另一篇:https://blog.csdn.net/qq_26012495/article/details/116614342?spm=1001.2014.3001.5501】Java8专门为函数式接口提供了@FunctionalInterface注解来校验该接口是否为函数式接口原创 2021-05-12 22:52:53 · 284 阅读 · 0 评论 -
jdk8新特性:Lambda表达式
Lambda表达式,又称为闭包或匿名函数,是jdk8的重要特性,可以使代码变的简单、优雅,增强代码可读性。用我们熟悉的Runnable,源代码就是一个简单的接口,里面有一个唯一的抽象方法:run()@FunctionalInterfacepublic interface Runnable { public abstract void run();}jdk7中我们实现run方法:public static void main(String[] args) { R原创 2021-05-10 23:24:54 · 187 阅读 · 5 评论 -
Jdk1.8新特性---Lambda表达式优势(策略模式改进实现)
Jdk1.8加入了诸多特性及语法改进,其中Labmda表达式是一个显著的语法改进,会使语法更加简洁。下面给两个例子来彰显他的优势,如果第一个例子还不能说服你的话,请看第二个例子。原创 2020-05-23 00:37:00 · 689 阅读 · 0 评论 -
java类之间的关系----组合 与 聚合 的区别
组合和聚合的关系很像,但是又有着本质区别。先把下面总结好的两句话放在文章的开头:组合的关系是A拥有B的全部生命周期,B就是A的一部分,切B的对象只能被A的一个对象拥有而不能共享。new A()的时候,B的对象随之产生,当A的一个对象消亡,随之使用的b对象也会跟着消亡。 聚合的关系是,A拥有B,但不拥有全部,也不是必须拥有,A与B之间是可以分离的,是两个单独的个体,各自拥有各自的生命周期。...原创 2018-11-28 10:54:29 · 531 阅读 · 0 评论 -
HashMap原理及部分底层源码分析
目录数据结构中的哈希散列hashCodeHashMap的数据结构 HashMap的使用过程详细部分底层代码分析:(基于jdk1.7,对比1.6)1、初始化2、Entry3、put方法4、自动扩容5、从HashMap中get元素时,首先计算key的hashCode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的...原创 2018-05-03 19:37:25 · 284 阅读 · 0 评论 -
Java入门Conllection,初识List、Set、Map 以及 各常用实现类对比
java语言是由C++语言改造而来的,当年响当当的数组,在操作的时候多有不便,因为数组初始容量不够的问题,可能在编程的过程中总会遇到,这个数组不够了怎么办,然后我们就要手动去写一个方法来解决这个问题。久而久之,java提供了一种自动帮你解决各种数组问题的强大工具,它就是List。【java的强大和让多数人的喜爱以及低难度的入门,多数来源于他强大的API(Application Programmin...原创 2018-04-28 19:09:52 · 872 阅读 · 0 评论