ThreadLocal浅析
从官方文档中描述:ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程下访问(get/set)时保证各个线程的变量相对独立于其他线程变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程间的上下文。
从官方文档中描述:ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程下访问(get/set)时保证各个线程的变量相对独立于其他线程变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程间的上下文。
Java 虚拟机的内存空间分为 5 个部分:
MVCC(Mutil-Version Concurrency Control),就是多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。
在Mysql的InnoDB引擎中就是指在已提交读(READ COMMITTD)和可重复读(REPEATABLE READ)这两种隔离级别下的事务对于SELECT操作会访问版本链中的记录的过程。
这就使得别的事务可以修改这条记录,反正每次修改都会在版本链中记录。SELECT可以去版本链中拿记录,这就实现了读-写,写-读的并发执行,提升了系统的性能。
Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。
CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信作用。
CyclicBarrier是一个同步的辅助类,允许一组线程相互之间等待,达到一个共同点,再继续执行。
Semaphore计数信号量用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量。信号量还可以用来实现某种资源池,或者对容器施加边界。
一直对常量池、字符串池、包装类对象池的认识不是那么深刻,下面巩固一下。
常量池分为静态常量池与动态常量池。
静态常量池在Class文件中(占用Class文件空间最大的数据项目之一),运行时常量池在方法区中,JDK1.8方法区已经被元数据区替代。
字符串常量池在1.7时被移动到了堆中。
String str = new String("Hello world") 创建了 2 个对象,一个驻留在字符串池,一个分配在 Java 堆,str 指向堆上的实例。
String.intern() 能在运行时向字符串池添加常量。
部分包装类实现了池化技术,-128~127 以内的对象可以重用。
现在使用NIO的场景越来越多,很多网上的技术框架或多或少的使用NIO技术,譬如Tomcat,Jetty。学习和掌握NIO技术已经不是一个JAVA攻城狮的加分技能,而是一个必备技能。
并发处理的广泛应用是Amdahl定律代替摩尔定律成为计算机性能发展源动力的根本原因,也是
Elasticsearch 设计的理念就是分布式搜索引擎,底层实现还是基于 Lucene 的,核心思想是在多台机器上启动多个 es 进程实例,组成一个 es 集群。以下是 es 的几个
简单来说,HashMap 由数组 + 链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前 entry 的 next 指向 null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,根据 key 的 hash 值&&key 对象的 equals 方法逐一比对查找。所以,性能考虑,HashMap 中的链表出现越少,性能才会越好。
注解@Transaction的底层实现是Spring AOP技术,而Spring AOP技术使用的是动态代理而自己调用自己的过程,并不存在代理对象的调用,这样就不会产生AOP去为我们设置@Transactional配置的参数,这样就出现了自调用注解失效的问题
装饰模式和代理模式的 UML 基本就是相同的,区别具体在哪呢?我看网上说的都是两模式的“意图”不同,可是“土豆可以拿去做薯片,不能说同样的原材料拿去做土豆泥之后就不叫土豆了”。