随笔分类 -  interview

数据库结构优化:分库分表如何实现?(垂直分表和水平分表)
摘要:一、优化表结构 (1)、尽量将表字段定义为 NOT NULL约束,这时由于在MySQL中含有空值的列很难进行查询优化,NULL值会使索引以及索引的统计信息变得很复杂。 (2)、对于只包含特定类型的字段,可以使用 enum、set 等数据类型。 (3)、数值型字段的比较,比字符串的比较效率高得多,字段 阅读全文
posted @ 2022-09-20 11:21 周文豪 阅读(833) 评论(0) 推荐(0) 编辑
并发时事务引发的问题和事务的隔离级别
摘要:一、事务的四大特征:ACID 原子性 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。 一致性 事务开始前和结束后,数据的完整 阅读全文
posted @ 2022-01-05 08:03 周文豪 阅读(53) 评论(0) 推荐(0) 编辑
如何在两个线程间共享数据?
摘要:如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。实现Runnable接口或callable接口,适合多个相同或不同的程序代码的线程去共享同一个资源。 多个线程共享数据分两种情况: 1、如果多个线程执行同一个Runnable实现类中的代码,此 阅读全文
posted @ 2021-02-25 17:53 周文豪 阅读(4330) 评论(0) 推荐(0) 编辑
使用 volatile 代替 synchronized的条件:volatile变量真正独立于其他变量和自己以前的值
摘要:总结: 1、volatile变量没有真正独立于其他变量和自己以前的值时,volatile无法保证原子性,此时可以使用synchronized和ReentrantLock来解决原子性问题 2、volatile变量真正独立于其他变量和自己以前的值时可以使用 volatile 代替 synchronize 阅读全文
posted @ 2021-02-25 15:19 周文豪 阅读(307) 评论(0) 推荐(1) 编辑
重量级锁synchronized的优化----自旋锁、自适应自旋锁、锁消除、锁粗化
摘要:synchronized是重量级锁,效率不高。但在jdk 1.6中对synchronize的实现进行了各种优化,使得它显得不是那么重了。jdk1.6对锁的实现引入了大量的优化,如自旋锁、自适应自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。 锁主要存在四中状态,依次是:无锁状态、偏向锁状态、轻量级锁 阅读全文
posted @ 2021-02-25 11:46 周文豪 阅读(724) 评论(0) 推荐(0) 编辑
Java内存模型(JMM)是什么?JMM 通过控制主内存与每个线程的本地内存之间的交互,来提供内存可见性保证
摘要:Java内存模型就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。 Java内存模型是根据英文Java Memory Model(JMM)翻译过来的。其实JMM并不像JVM内存结构一样是真实存在的。他只是一个抽象 阅读全文
posted @ 2021-02-25 10:41 周文豪 阅读(796) 评论(0) 推荐(0) 编辑
多线程死锁
摘要:多线程死锁:同步中嵌套同步,导致锁无法释放。 死锁解决办法:不要在同步中嵌套同步 public class Demo06DeadLock { public static void main(String[] args) { //创建线程任务对象 Ticket ticket = new Ticket( 阅读全文
posted @ 2021-02-25 09:56 周文豪 阅读(86) 评论(0) 推荐(0) 编辑
线程安全之卖票案例
摘要:线程安全: 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的,反之则是线程不安全的。 卖票案例: public class Demo08 { public static void main(S 阅读全文
posted @ 2021-02-24 15:57 周文豪 阅读(131) 评论(0) 推荐(0) 编辑
对Map进行复合操作(读写)且并发执行时,无法保证业务的行为是正确的,对读写操作进行同步则可以解决。
摘要:ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全的Map容器,比如 Hashtable和Collections.synchronizedMap。线程安全的容器,特别是Map,很多情况下一个业务中 涉及容器的操作有多个(读get写put,remove),即复合操 阅读全文
posted @ 2021-02-24 11:55 周文豪 阅读(366) 评论(0) 推荐(0) 编辑
ConcurrentHashMap的使用场景
摘要:一、并发容器ConcurrentHashMap HashMap是我们用得非常频繁的一个集合,但是它是线程不安全的。并且在多线程环境下,put操作是有可能产生死循环,不过在JDK1.8的版本中更换了数据插入的顺序,已经解决了这个问题。 为了解决该问题,提供了Hashtable和Collections. 阅读全文
posted @ 2021-02-24 11:27 周文豪 阅读(4621) 评论(0) 推荐(0) 编辑
为什么ConcurrentHashMap,HashTable不支持key,value为null?
摘要:ConcurrentHashmap、HashMap和Hashtable都是key-value存储结构,但他们有一个不同点是 ConcurrentHashmap、Hashtable不支持key或者value为null,而HashMap是支持的。 为什么要这么设计? 在网上找到了这样的解答:The ma 阅读全文
posted @ 2021-02-22 17:42 周文豪 阅读(463) 评论(0) 推荐(0) 编辑
HashMap扩容后是否需要rehash?
摘要:需要,因为要重新计算旧数组元素在新数组地址。HashMap在JDK1.8中的rehash算法(也就是扩容后重新为里面的键值对寻址的算法)进行优化。hash寻址算法是 index =(n - 1) & hash 在JDK1.7的时候,是将数组扩容为两倍,然后将HashMap中所有的key重新进行has 阅读全文
posted @ 2021-02-22 16:51 周文豪 阅读(4670) 评论(0) 推荐(1) 编辑
为什么我们在定义HashMap的时候,就指定它的初始化大小呢
摘要:在当我们对HashMap初始化时没有设置初始化容量,系统会默认创建一个容量为16的大小的集合。当HashMap的容量值超过了临界值(默认16*0.75=12)时,HashMap将会重新扩容到下一个2的指数幂(16->32)。HashMap扩容将要进行resize的操作,频繁resize,会导致降低性 阅读全文
posted @ 2021-02-22 16:11 周文豪 阅读(1242) 评论(0) 推荐(0) 编辑
HashMap是如何进行扩容的?
摘要:HashMap通过resize()方法进行扩容。 源码解析: resize()函数有两种使用情况: 一、当table数组为null时初始化hash表。 二、当table数组不为null时进行扩容。 1、如果table数组的容量超过最大容量时,无法扩容,直接返回旧的数组。并将threshold值设置为 阅读全文
posted @ 2021-02-22 15:57 周文豪 阅读(5920) 评论(0) 推荐(2) 编辑
HashMap什么时候进行扩容?
摘要:Threshold:table数组元素个数size的大小超过threshold且且Node<K,V>[] table数组长度没有超过64时时table数组扩容。当hashmap中的元素个数size超过数组长度*loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,也就是说 阅读全文
posted @ 2021-02-22 12:13 周文豪 阅读(3204) 评论(0) 推荐(0) 编辑
谈一下HashMap的底层原理是什么?
摘要:底层原理:Map + 无序 + 键唯一 + 哈希表 (数组+Entry)+ 存取值 1、HashMap是Map接口的实现类。实现HashMap对数据的操作,允许有一个null键,多个null值。 ConcurrentHashmap、Hashtable不支持key或者value为null,而HashM 阅读全文
posted @ 2021-02-22 11:54 周文豪 阅读(1787) 评论(0) 推荐(0) 编辑
谈一下hashMap中put是如何实现的?
摘要:源码: Hash(key):计算出key的hash值。 put方法详解: 1、如果table数组为null或者table数组的长度为0,则调用resize()方法扩容并返回table数组。数组的长度为n,(put时确保table数组不为空且长度不为0) 2、如果table数组不为null且数组的长度 阅读全文
posted @ 2021-02-22 11:47 周文豪 阅读(1017) 评论(0) 推荐(0) 编辑
HashMap源码解析
摘要:数组: 数组存储区间是连续的,占用内存严重,故空间复杂度很大,但数组的二分查找时间复杂度很小,为 o(1),数组的特点:查找速度快、插入和删除效率低 链表: 链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,为 o(n),链表的特点:查找速度慢、插入和删除效率高 ArrayLi 阅读全文
posted @ 2021-02-21 12:33 周文豪 阅读(515) 评论(0) 推荐(0) 编辑