Everything Will Work Out Just Fine

later equals never


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

Java-8-HashMap

发表于 2020-09-25 | 更新于: 2020-09-25 | 分类于 学习笔记

Java 8系列之重新认识HashMap

HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。

Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示:

img

阅读全文 »

AQS原理及应用

发表于 2020-09-15 | 更新于: 2020-09-15 | 分类于 多线程

从ReentrantLock的实现看AQS的原理及应用

前言

Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占锁的知识点,同时采取问答的模式来帮助大家理解AQS。由于篇幅原因,本篇文章主要阐述AQS中独占锁的逻辑和Sync Queue,不讲述包含共享锁和Condition Queue的部分(本篇文章核心为AQS原理剖析,只是简单介绍了ReentrantLock,感兴趣同学可以阅读一下ReentrantLock的源码)。

下面列出本篇文章的大纲和思路,以便于大家更好地理解:

img

阅读全文 »

Java锁相关

发表于 2020-09-11 | 更新于: 2020-09-11 | 分类于 学习笔记

前言

Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。

Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录:

img

阅读全文 »

操作系统相关内容

发表于 2020-09-09 | 更新于: 2020-09-13 | 分类于 学习笔记

操作系统

进程和线程有什么区别?

  • 进程是系统进行资源分配和调度的基本单位,线程是CPU调度和分派的基本单位
  • 线程依赖于进程存在,一个进程至少有一个线程
  • 进程有自己的独立地址空间,线程共享进程的地址空间
  • 进程是拥有系统资源的一个独立单位,而线程自己基本上不拥有系统资源,只有一些在运行中必不可少的资源(如程序计数器、一组寄存器和栈),和其他线程共享本进程的相关资源,如内存、I/O、CPU等
  • 在进程切换时,涉及到整个当前进程CPU环境的保存环境设置以及新被调度运行的CPU环境的设置,而线程切换只需要保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作

同一进程中的线程可以共享哪些数据?

  • 进程代码段
  • 进程的共有数据(全局变量、静态变量)
  • 进程打开的文件描述符
  • 进程的当前目录
  • 信号处理器/信号处理函数:对收到的信号的处理方式
  • 进程ID和进程组ID
阅读全文 »

事务+隔离级别+阻塞+死锁

发表于 2020-09-08 | 更新于: 2020-09-08 | 分类于 学习笔记

事务+隔离级别+阻塞+死锁

本篇主要内容如下:

img

一、事务

1.1 什么是事务

为单个工作单元而执行的一系列操作。如查询、修改数据、修改数据定义。

1.2 语法

「(1)显示定义事务的开始、提交」

1
BEGIN` `TRAN``INSERT` `INTO` `b(t1) ``VALUES``(1)``INSERT` `INTO` `b(t1) ``VALUES``(2)``COMMIT` `TRAN

「(2)隐式定义」

如果不显示定义事务的边界,则SQL Server会默认把每个单独的语句作为一个事务,即在执行完每个语句之后就会自动提交事务。

阅读全文 »

@Transactional事务问题分析

发表于 2020-09-07 | 更新于: 2020-09-07 | 分类于 学习笔记

一个@Transactional哪里来这么多坑?

以下文章来源于程序员DMZ ,作者程序员DMZ

前言

这篇文章我们来聊一聊平常工作时使用事务可能出现的一些问题(本文主要针对使用@Transactional进行事务管理的方式进行讨论)以及对应的解决方案

  1. 事务失效
  2. 事务回滚相关问题
  3. 读写分离跟事务结合使用时的问题

事务失效

事务失效我们一般要从两个方面排查问题

数据库层面

数据库层面,数据库使用的存储引擎是否支持事务?默认情况下MySQL数据库使用的是Innodb存储引擎(5.5版本之后),它是支持事务的,但是如果你的表特地修改了存储引擎,例如,你通过下面的语句修改了表使用的存储引擎为MyISAM,而MyISAM又是不支持事务的

1
alter table table_name engine=myisam;

这样就会出现“事务失效”的问题了

「解决方案」:修改存储引擎为Innodb。

阅读全文 »

序列化和反序列化

发表于 2020-08-28 | 更新于: 2020-08-28 | 分类于 学习笔记

序列化是干啥用的?

序列化的原本意图是希望对一个Java对象作一下“变换”,变成字节序列,这样一来方便持久化存储到磁盘,避免程序运行结束后对象就从内存里消失,另外变换成字节序列也更便于网络运输和传播,所以概念上很好理解:

  • 序列化:把Java对象转换为字节序列。
  • 反序列化:把字节序列恢复为原先的Java对象。

img

而且序列化机制从某种意义上来说也弥补了平台化的一些差异,毕竟转换后的字节流可以在其他平台上进行反序列化来恢复对象。

事情就是那么个事情,看起来很简单,不过后面的东西还不少,请往下看。

阅读全文 »

剑指Offer题解(3-40)

发表于 2020-08-27 | 更新于: 2020-08-29 | 分类于 leetcode

剑指Offer题解(3-40)

面试题03. 数组中重复的数字

找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:

1
2
3
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3

思路和代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public int findRepeateNumber(int[] nums) {
for(int i=0; i<nums.length; i++) { //如果当前值不是当前索引对应的值
while(nums[i] != i) {
int cur = nums[i];
if(nums[cur] = cur) //当前值对应的索引是否已经存有了当前值,如果是说明重复
return cur;
else { //如果不是,就将当前值放到自己对应的索引,将自己对应索引的值放过来
nums[i] = nums[cur];
nums[cur] = cur;
}
}
}
return 0; //没找到,返回0(随便返回一个数即可)
}
}
阅读全文 »

浅拷贝与深拷贝

发表于 2020-08-27 | 更新于: 2020-08-27 | 分类于 学习笔记

值类型 vs 引用类型

这两个概念的准确区分,对于深、浅拷贝问题的理解非常重要。

正如Java圣经《Java编程思想》第二章的标题所言,在Java中一切都可以视为对象!

所以来到Java的世界,我们要习惯用引用去操作对象。在Java中,像数组、类Class、枚举Enum、Integer包装类等等,就是典型的引用类型,所以操作时采用的也是引用传递的方式;

但是Java的语言级基础数据类型,诸如int这些基本类型,操作时一般采取的则是值传递的方式,所以有时候也称它为值类型。

阅读全文 »

ArrayList源码分析

发表于 2020-08-25 | 更新于: 2020-08-25 | 分类于 数据结构

ArrayList源码分析

类图

img

  • 实现了RandomAccess接口,可以随机访问
  • 实现了Cloneable接口,可以克隆
  • 实现了Serializable接口,可以序列化、反序列化
  • 实现了List接口,是List的实现类之一
  • 实现了Collection接口,是Java Collections Framework成员之一
  • 实现了Iterable接口,可以使用for-each迭代

属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 序列化版本UID
private static final long
serialVersionUID = 8683452581122892189L;

/**
* 默认的初始容量
*/
private static final int
DEFAULT_CAPACITY = 10;

/**
* 用于空实例的共享空数组实例
* new ArrayList(0);
*/
private static final Object[]
EMPTY_ELEMENTDATA = {};

/**
* 用于提供默认大小的实例的共享空数组实例
* new ArrayList();
*/
private static final Object[]
DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

/**
* 存储ArrayList元素的数组缓冲区
* ArrayList的容量,是数组的长度
*
* non-private to simplify nested class access
*/
transient Object[] elementData;

/**
* ArrayList中元素的数量
*/
private int size;
阅读全文 »
123
ZrBac

ZrBac

postgraduate sutdent

30 日志
8 分类
9 标签
RSS
GitHub
0%
© 2020 ZrBac