摘要:
synchronized是重量级锁,效率不高。但在jdk 1.6中对synchronize的实现进行了各种优化,使得它显得不是那么重了。jdk1.6对锁的实现引入了大量的优化,如自旋锁、自适应自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。 锁主要存在四中状态,依次是:无锁状态、偏向锁状态、轻量级锁
阅读全文
posted @ 2021-02-25 11:46
周文豪
阅读(815)
推荐(0)
摘要:
Java内存模型就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。 Java内存模型是根据英文Java Memory Model(JMM)翻译过来的。其实JMM并不像JVM内存结构一样是真实存在的。他只是一个抽象
阅读全文
posted @ 2021-02-25 10:41
周文豪
阅读(872)
推荐(0)
摘要:
多线程死锁:同步中嵌套同步,导致锁无法释放。 死锁解决办法:不要在同步中嵌套同步 public class Demo06DeadLock { public static void main(String[] args) { //创建线程任务对象 Ticket ticket = new Ticket(
阅读全文
posted @ 2021-02-25 09:56
周文豪
阅读(94)
推荐(0)
摘要:
线程安全: 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的,反之则是线程不安全的。 卖票案例: public class Demo08 { public static void main(S
阅读全文
posted @ 2021-02-24 15:57
周文豪
阅读(144)
推荐(0)
摘要:
ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全的Map容器,比如 Hashtable和Collections.synchronizedMap。线程安全的容器,特别是Map,很多情况下一个业务中 涉及容器的操作有多个(读get写put,remove),即复合操
阅读全文
posted @ 2021-02-24 11:55
周文豪
阅读(403)
推荐(0)
摘要:
一、并发容器ConcurrentHashMap HashMap是我们用得非常频繁的一个集合,但是它是线程不安全的。并且在多线程环境下,put操作是有可能产生死循环,不过在JDK1.8的版本中更换了数据插入的顺序,已经解决了这个问题。 为了解决该问题,提供了Hashtable和Collections.
阅读全文
posted @ 2021-02-24 11:27
周文豪
阅读(5704)
推荐(0)
摘要:
ConcurrentHashmap、HashMap和Hashtable都是key-value存储结构,但他们有一个不同点是 ConcurrentHashmap、Hashtable不支持key或者value为null,而HashMap是支持的。 为什么要这么设计? 在网上找到了这样的解答:The ma
阅读全文
posted @ 2021-02-22 17:42
周文豪
阅读(501)
推荐(0)
摘要:
需要,因为要重新计算旧数组元素在新数组地址。HashMap在JDK1.8中的rehash算法(也就是扩容后重新为里面的键值对寻址的算法)进行优化。hash寻址算法是 index =(n - 1) & hash 在JDK1.7的时候,是将数组扩容为两倍,然后将HashMap中所有的key重新进行has
阅读全文
posted @ 2021-02-22 16:51
周文豪
阅读(4764)
推荐(1)
摘要:
在当我们对HashMap初始化时没有设置初始化容量,系统会默认创建一个容量为16的大小的集合。当HashMap的容量值超过了临界值(默认16*0.75=12)时,HashMap将会重新扩容到下一个2的指数幂(16->32)。HashMap扩容将要进行resize的操作,频繁resize,会导致降低性
阅读全文
posted @ 2021-02-22 16:11
周文豪
阅读(1260)
推荐(0)
摘要:
HashMap通过resize()方法进行扩容。 源码解析: resize()函数有两种使用情况: 一、当table数组为null时初始化hash表。 二、当table数组不为null时进行扩容。 1、如果table数组的容量超过最大容量时,无法扩容,直接返回旧的数组。并将threshold值设置为
阅读全文
posted @ 2021-02-22 15:57
周文豪
阅读(5953)
推荐(2)