哪种网站语言最好,移动端网站制作,杭州餐饮网站建设,陕煤化建设集团网站矿建二公司1.说说hashmap的负载因子 2.Hashmap和Hashtable有什么不一样的#xff1f;Hashmap一般怎么用#xff1f; 3.ConcurrentHashMap怎么实现的#xff1f; 4.分段锁怎么加锁的#xff1f; 5.分段锁是可重入的吗#xff1f; 6.已经用了synchronized#xff0c;为什么还要用CAS呢… 1.说说hashmap的负载因子 2.Hashmap和Hashtable有什么不一样的Hashmap一般怎么用 3.ConcurrentHashMap怎么实现的 4.分段锁怎么加锁的 5.分段锁是可重入的吗 6.已经用了synchronized为什么还要用CAS呢 7.ConcurrentHashMap用了悲观锁还是乐观锁? 8.HashTable 底层实现原理是什么 9.HashTable线程安全是怎么实现的 10.hashtable 和concurrentHashMap有什么区别 11.说一下HashMap和Hashtable、ConcurrentMap的区别 1.说说hashmap的负载因子
负载因子为0.75。这是代码编写者在基于概率论和分布的知识权衡了碰撞发生的可能性和空间浪费。负载因子太低会导致大量的空桶浪费空间负载因子太高会导致大量的碰撞降低性能。0.75 的负载因子在这两个因素之间取得了良好的平衡。
2.Hashmap和Hashtable有什么不一样的Hashmap一般怎么用
最主要的区别就是线程安全与否hashmap是线程安全的扩容机制很明确了补充一下插入元素后如果链表长度大于阈值默认为8先判断数组长度是否小于64如果小于则扩充数组反之将链表转化为红黑树如果小于则扩充数组反之将链表转化为红黑树
HashTable效率低是因为保证线程同步对其内部方法都采用了synchronized修饰。且不可以存储null的key和value。初始容量是11每一次扩容是2n1底层是数组链表。 基本没有人用了用ConcurrentHashMap。
3.ConcurrentHashMap怎么实现的
1.7 大数组Segment小数组链表的NodeEntry。Segment 是一种可重入锁ReentrantLock。 1.8进行了修改抛弃了segment并引入红黑树提高查找效率。对头结点加锁来保证线程安全的锁的粒度相比 Segment 来说更小了发生冲突和加锁的频率降低了并发操作的性能就提高了。主要通过 volatile CAS 或者 synchronized 来实现的线程安全的。 一、使用volatile保证当Node中的值变化时对于其他线程是可见的 二、使用table数组的头结点作为synchronized的锁来保证写操作的安全 三、当头结点为null时使用CAS操作来保证数据能正确的写入。
volatile V val;
volatile NodeK,V next;4.分段锁怎么加锁的
Segment 本身就继承了 ReentrantLock 具备了锁的功能在每次 put 前都会先尝试 tryLock() 加锁如果成功则进行元素存储如果失败就会调用 Segment 的 scanAndLockForPut() 尝试循环加锁并扫描指定的 key。
5.分段锁是可重入的吗
继承的时ReentrantLock。是可重入锁。 任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞首先他需要具备两个条件 线程再次获取锁所需要去识别获取锁的线程是否为当前占据锁的线程如果是则再次获取成功 锁的最终释放线程重复n次获取了锁随后在第n次释放该锁后其它线程能够获取到该锁。锁的最终释放要求锁对于获取进行计数自增计数表示当前线程被重复获取的次数而被释放时计数自减当计数为0时表示锁已经成功释放。
6.已经用了synchronized为什么还要用CASCompare-And-Swap呢
权衡。主要是根据锁竞争程度来判断的一些部分用到synchronized一些部分用CAS。 在putVal中如果计算出来的hash槽没有存放元素那么就可以直接使用CAS来进行设置值这是因为在设置元素的时候因为hash值经过了各种扰动后造成hash碰撞的几率较低那么我们可以预测使用较少的循环CAS来完成具体的hash落槽操作。 当发生了hash碰撞的时候说明容量不够用了或者已经有大量线程访问了当发生了hash碰撞的时候说明容量不够用了或者已经有大量线程访问了。
CAS 是乐观锁线程执行的时候不会加锁它会假设此时没有冲突然后完成某项操作如果因为冲突失败了就重试直到成功为止。多用于“读多写少“的环境避免频繁加锁影响性能。 synchronized是悲观锁。对于悲观锁来说它总是认为每次访问共享资源时会发生冲突所以必须对每次数据操作加上锁以保证临界区的程序同一时间只能有一个线程在执行。多用于”写多读少“的环境避免频繁失败和重试影响性能。 CAS因为 CAS 是一种原子操作它是一种系统原语是一条 CPU 的原子指令从 CPU 层面已经保证它的原子性。原本有三个元素一个是要更新的变量一个是预期值一个是更新值。首先查看要更新变量是否是预期值是的话说明没有其他线程修改过赋予新值。否则什么都不做。但失败的线程并不会被挂起仅是被告知失败并且允许再次尝试当然也允许失败的线程放弃操作。 自旋锁。结合着锁来理解的话就是先获取一次锁如果获取不到锁会不停的循环获取直到获取到。不像普通的锁那样如果获取不到锁就进入阻塞状态。 自旋锁等于循环CAS。
7.ConcurrentHashMap用了悲观锁还是乐观锁?
用到了synchronized是悲观锁和CAS是乐观锁。
8.HashTable 底层实现原理是什么
Hashtable的底层数据结构主要是数组加上链表数组是主体链表是解决hash冲突存在的。 HashTable是线程安全的实现方式是Hashtable的所有公共方法均采用synchronized关键字当一个线程访问同步方法另一个线程也访问的时候就会陷入阻塞或者轮询的状态。
9.HashTable线程安全是怎么实现的 10.hashtable 和concurrentHashMap有什么区别
底层数据结构和实现线程安全的方法粒度。
11.说一下HashMap和Hashtable、ConcurrentMap的区别