随笔分类 -  java基础

此分类主要用来学习java基础知识
摘要:一.概述 Java虚拟机在执行Java程序时,会把它管理的内存划分为若干个不同的数据区域。JDK1.8和之前版本略有不同。 JDK1.8之前: JDK1.8: 线程私有的: 程序计数器 虚拟机栈 本地方法栈 线程共享的: 堆 方法区 直接内存 (非运行时数据区的一部分) 二.JVM各区域详解 2.1 阅读全文
posted @ 2021-08-25 23:54 Vincent-yuan 阅读(443) 评论(0) 推荐(0) 编辑
摘要:HashMap在多线程环境下存在线程安全问题,那你一般都是怎么处理这种情况的? 一般在多线程的场景,可以使用好几种不同的方式去代替: 使用Collections.synchronizedMap(Map)创建线程安全的map集合; Hashtable ConcurrentHashMap 不过出于线程并 阅读全文
posted @ 2021-08-24 08:04 Vincent-yuan 阅读(90) 评论(0) 推荐(0) 编辑
摘要:在HashMap中,indexFor方法其实主要是将hashcode换成链表数组中的下标。 static int indexFor(int h, int length) { return h & (length-1); } 这里实际就是取模。 用位运算是因为它比取模运算效率要高很多,因为它是直接对内 阅读全文
posted @ 2021-08-23 23:08 Vincent-yuan 阅读(2384) 评论(0) 推荐(0) 编辑
摘要:1.jdk1.7中的HashMap 1.1 扩容造成死循环分析过程 1.2 扩容造成数据丢失分析过程 2.jdk1.8中HashMap 总结 前言:我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线程不安全主要体现在什么地方呢,本文将对该问题进行解密。 1.jdk1.7中的H 阅读全文
posted @ 2021-08-21 18:07 Vincent-yuan 阅读(548) 评论(0) 推荐(0) 编辑
摘要:你了解数据结构中的HashMap么?能跟我聊聊他的结构和底层原理么? HashMap是我们非常常用的数据结构,由数组和链表组合构成的数据结构。 大概如下,数组里面每个地方都存了Key-Value这样的实例,在Java7叫Entry在Java8中叫Node。 HashMap在put插入时,会根据key 阅读全文
posted @ 2021-08-20 23:26 Vincent-yuan 阅读(63) 评论(0) 推荐(0) 编辑
摘要:Queue 是一端进另一端出的线性数据结构;而 Deque 是两端都可以进出的。 Queue Java 中的 这个 Queue 接口稍微有点坑,一般来说队列的语义都是先进先出(FIFO)的。 但是这里有个例外,就是 PriorityQueue,也叫 heap,并不按照进去的时间顺序出来,而是按照规定 阅读全文
posted @ 2021-08-20 07:29 Vincent-yuan 阅读(212) 评论(0) 推荐(1) 编辑
摘要:本文先从 HashMap 的遍历方法讲起,然后再从性能、原理以及安全性等方面,来分析 HashMap 各种遍历方式的优势与不足,本文主要内容如下图所示: HashMap 遍历 HashMap 遍历从大的方向来说,可分为以下 4 类: 迭代器(Iterator)方式遍历; For Each 方式遍历; 阅读全文
posted @ 2021-08-19 22:42 Vincent-yuan 阅读(8648) 评论(0) 推荐(1) 编辑
摘要:在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历过,本来觉得没什么好写的,因为Java的HashMap是非线程安全的,所以在并发下必然出 阅读全文
posted @ 2021-08-13 07:57 Vincent-yuan 阅读(72) 评论(0) 推荐(0) 编辑
摘要:1. 剖析面试最常见问题之 Java 集合框架 1.1. 集合概述 1.1.1. Java 集合概览 1.1.2. 说说 List,Set,Map 三者的区别? 1.1.3. 集合框架底层数据结构总结 1.1.3.1. List 1.1.3.2. Set 1.1.3.3. Map 1.1.4. 如何 阅读全文
posted @ 2021-08-10 23:09 Vincent-yuan 阅读(181) 评论(0) 推荐(0) 编辑
摘要:多线程有几种实现方式?如果被问到这个问题一定很头疼,因为百度一下随便就能出现各种各样的答案。两种、三种、四种、五种、六种、七种。。。 但本质上来讲,个人认为只有一种方式:实现Runnable接口。 先放个图: 1、实现Runnable接口 1 public class DemoThreadTask 阅读全文
posted @ 2021-08-06 00:16 Vincent-yuan 阅读(68) 评论(0) 推荐(0) 编辑
摘要:interrupt()、interrupted()、isInterrupted() 这三个方法都涉及到多线程的一个知识点 中断机制 三个中断方法 中断标识位是JDK源码看不到的,是虚拟机线程实现层面的。 下面结合代码逐一看一下这三个方法的作用,以及为什么中断标识位是虚拟机实现层面的: 1、inter 阅读全文
posted @ 2021-08-05 23:55 Vincent-yuan 阅读(137) 评论(0) 推荐(0) 编辑
摘要:一.中断概述 这篇文章主要记录使用 interrupt() 方法中断线程,以及如何对InterruptedException进行处理。感觉对InterruptedException异常进行处理是一件谨慎且有技巧的活儿。 Thread.stop, Thread.suspend, Thread.resu 阅读全文
posted @ 2021-08-05 23:46 Vincent-yuan 阅读(365) 评论(0) 推荐(0) 编辑
摘要:这里主要是因为最近使用jdbc连接数据库时,发现相比之前一般的连接过程,现在竟然不用加载驱动也可以了。这里研究记录下。 JDBC JDBC是一个连接数据库的Java API,包含了相关的接口和类。 但是,他不提供针对具体数据库(MySQL、MS、Oracle)的实际操作,而只是提供了接口,以及调用框 阅读全文
posted @ 2021-07-31 06:17 Vincent-yuan 阅读(483) 评论(0) 推荐(0) 编辑
摘要:一 几个常见的对比 1 Runnable vs Callable Runnable自 Java 1.0 以来一直存在,但Callable仅在 Java 1.5 中引入,目的就是为了来处理Runnable不支持的用例。 Runnable 接口不会返回结果或抛出检查异常,但是**Callable 接口* 阅读全文
posted @ 2021-07-22 08:00 Vincent-yuan 阅读(128) 评论(0) 推荐(0) 编辑
摘要:使用线程池的好处 池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。 线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。 这里 阅读全文
posted @ 2021-07-22 07:24 Vincent-yuan 阅读(157) 评论(0) 推荐(0) 编辑
摘要:1.Atomic原子类概述 Java1.5的Atomic包名为java.util.concurrent.atomic。 这个包提供了一系列原子类。 这些类可以保证多线程环境下,当某个线程在执行atomic的方法时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待 阅读全文
posted @ 2021-07-17 09:52 Vincent-yuan 阅读(99) 评论(0) 推荐(0) 编辑
摘要:1.synchronized 关键字 1.1.说一说自己对于 synchronized 关键字的了解 1.2. 说说自己是怎么使用 synchronized 关键字 1.3. 构造方法可以使用 synchronized 关键字修饰么? 1.3. 讲一下 synchronized 关键字的底层原理 1 阅读全文
posted @ 2021-07-15 08:01 Vincent-yuan 阅读(134) 评论(0) 推荐(0) 编辑
摘要:Java 并发基础常见面试题总结 1. 什么是线程和进程? 1.1. 何为进程? 1.2. 何为线程? 2. 请简要描述线程与进程的关系,区别及优缺点? 2.1. 图解进程和线程的关系 2.2. 程序计数器为什么是私有的? 2.3. 虚拟机栈和本地方法栈为什么是私有的? 2.4. 一句话简单了解堆和 阅读全文
posted @ 2021-07-15 07:40 Vincent-yuan 阅读(366) 评论(0) 推荐(0) 编辑
摘要:什么是重入锁? 通常情况下,锁可以用来控制多线程的访问行为。 那对于同一个线程,如果连续两次对同一把锁进行lock,会怎么样了? 对于一般的锁来说,这个线程就会被永远卡死在那边,比如: void handle() { lock(); lock(); //和上一个lock()操作同一个锁对象,那么这里 阅读全文
posted @ 2021-07-13 22:01 Vincent-yuan 阅读(145) 评论(0) 推荐(0) 编辑
摘要:所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。 synchronized 和 ReentrantLock 都是可重入锁。 可重入锁的意义在于防止死锁。 可重入锁简单演示 什么是 “可重入”,可重入就是说某个线程已经获得某个锁,可以 阅读全文
posted @ 2021-07-13 21:52 Vincent-yuan 阅读(4819) 评论(0) 推荐(1) 编辑