发布了文章2020-08-11
前言前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢? {代码...} 当时看到这题,瞬间勾起了我的回忆。遥想当年,也曾经碰到过类似的问题,当时研究了好久才搞明白,这里再记录一下这个问题的思路。先来说一下答案:输出:hello;解决这类问题首先要搞...
发布了文章2020-08-11
索引就跟我们的字典目录一样,如果一本字典没有目录,那么你要找一个字,那就相当费劲,得从头一点一点的找;在数据库中也是一样,如果一张表没有索引,那查询一条数据也是相当费劲。
发布了文章2020-08-11
隔离级别也有四种:未提交读、提交读、可重复读、串行化。也不是所有数据库都支持事务的,甚至同一数据库不同存储引擎事务都不是一样的,例如MySQL数据库,里面InnoDB 引擎支持事务,而MyISAM 引擎不支持事务。
发布了文章2020-08-11
而spring事务是封装在数据库事务之上的一种事务处理机制,它有两种管理方式:编程式事务和声明式事务。在平时使用中,我们大多使用@Transactional声明式事务来管理,这也是spring推荐的方式,下面例子也统一采用此种方式。
发布了文章2020-08-11
Gitee是一个类似于GitHub的国内网站,至于为什么用Gitee搭建图床而不用Github,就是因为他快,毕竟GitHub是国外网站,如果没有点科学上网的手段,那网速慢得怀疑人生。
发布了文章2020-08-10
上回说到如何使用zookeeper实现分布式锁,它是通过节点的新建和删除来实现的,这种频繁的io操作在并发很高的情况下肯定是不适用的,那这节我们来看看如何使用redis实现分布式锁。
发布了文章2020-08-10
zookeeper的Java客户端主要有zkclient和Curator,此篇文章介绍Curator,就冲他官网的简介,zookeeper书的作者Patrick Hunt给了这么高的评价:Guava is to Java what Curator is to Zookeeper。
发布了文章2020-08-10
zookeeper的Java客户端主要有zkclient和Curator,此篇文章介绍Curator,就冲他官网的简介,zookeeper书的作者Patrick Hunt给了这么高的评价:Guava is to Java what Curator is to Zookeeper。
发布了文章2020-08-10
在生产环境中,不论什么单体应用都不能保证一直可用,比如服务宕机,云厂商出现的bug或者物理机器遇到的天灾人祸这些,虽然概率小,但是也不能完全避免。为了实现高可用,就需要集群,同一应用多地部署,就算其中一个挂了,其他的也能继续提供服务。
发布了文章2020-08-10
首先我们要知道查询服务器都是通过IP来查找的,那么第一步就要查询www.baidu.com这个域名对应的IP是什么,这时候就需要去查询DNS服务器,那这个DNS服务器的地址我们怎么知道呢?一般DNS服务器地址可以自动获取或者手动设置
发布了文章2020-08-10
前面说过Java中的IO操作,但是传统的IO是阻塞模式的,在高并发的系统中肯定是不可行的,这次我们来介绍Java中提供的另外一种IO操作--NIO。
发布了文章2020-08-10
io流在Java的知识体系中,属于很杂的那种了,主要是涉及的类太多,输入流、输出流、文件输入流、文件输出流、字节输入流和输出流、字符输入流和输出流等等,经常把人弄晕。但是它的用途却非常广泛,文件的操作、网络的操作等都离不开它,本文通过平时常用操作来梳理...
发布了文章2020-05-27
ConcurrentHashMap初始化时有16个Segment,每个Segment中又包含了HashEntry数组,每个HashEntry又是一个链表,可以看出,Segment的结构和HashMap类似,你可以这样理解:ConcurrentHashMap由多个HashMap组成。
发布了文章2020-05-27
HashMap底层的数据结构 HashMap底层是一个hash表加链表结构,jdk1.7以后,链表长度达到阈值(8)以后会转成红黑树。 下面我们通过源码看看HashMap的底层实现。 源码解析 这里主要分析两个重要方法:put()和resize()方法 put()方法 {代码...} put()方法中会将key的hash...
发布了文章2020-05-27
jdk1.7的HashMap HashMap从jdk1.8以后有较大改动,主要有两点: 插入元素改成尾插法(1.7是头插法) 链表长度超过8个转成红黑树(1.7一直是链表) jdk为何会做这两点改变呢? 下面我们通过1.7的源码来看看这两点有什么问题或者不足之处 头插法改成尾插法 我们先来看...
发布了文章2020-05-26
随着业务的发展,系统的功能也越来越多,这时候很多业务操作就需要异步执行,提高效率。大多时候,我们都可以采用线程池来实现异步执行的需求,但是,有时候主流程需要等待其他任务执行完以后才能继续执行,又或者是主流程需要知道其他任务执行的结果,这时候,就需...
发布了文章2020-05-26
AQS中提供了独占锁和共享锁。独占锁使用acquire和release方法实现;共享锁使用acquireShared和releaseShared实现。下面我们看看源码中共享锁具体怎么实现的,以Semaphore和CountDownLatch为例
发布了文章2020-03-06
对象头包括两部分信息 第一部分官方称作“Mark Word”,用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID和偏向时间戳等。考虑到虚拟机的空间效率,Mark Word被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信...
发布了文章2020-02-28
虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类,实现这个动作的代码模块称为“类加载器”。
发布了文章2020-02-22
程序计数器是一块较小的空间,它可以看作是当前线程所执行的字节码的行号指示器。由于Java虚拟机的多线程是通过线程轮流切换并分配处理其执行时间的方式来实现的,在任何一个确定的时刻,一个处理起都只会执行一条线程中的指令。因此为了线程切换后能恢复到正确的执...