分段锁其实是一种锁的设计,并不是详细的一种锁,对付ConcurrentHashMap而言,其并发的实现就是通过度段锁的形式来实现高效的并发操纵。
我们以ConcurrentHashMap来说一下分段锁的寄义以及设计思想,ConcurrentHashMap中的分段锁称为Segment,它即雷同于HashMap(JDK7和JDK8中HashMap的实现)的布局,即内部拥有一个Entry数组,数组中的每个元素又是一个链表;同时又是一个ReentrantLock(Segment担任了ReentrantLock)。
当需要put元素的时候,并不是对整个hashmap举办加锁,而是先通过hashcode来知道他要放在哪一个分段中,然后对这个分段举办加锁,所以当多线程put的时候,只要不是放在一个分段中,就实现了真正的并行的插入。
可是,在统计size的时候,可就是获取hashmap全局信息的时候,就需要获取所有的分段锁才气统计。
分段锁的设计目标是细化锁的粒度,当操纵不需要更新整个数组的时候,就仅仅针对数组中的一项举办加锁操纵。
13.11 方向锁方向锁是指一段同步代码一直被一个线程所会见,那么该线程会自动获取锁。低落获取锁的价钱。
13.12 轻量级锁轻量级锁是指当锁是方向锁的时候,被另一个线程所会见,方向锁就会进级为轻量级锁,其他线程会通过自旋的形式实验获取锁,不会阻塞,提高机能。
13.13 重量级锁重量级锁是指当锁为轻量级锁的时候,另一个线程固然是自旋,但自旋不会一直一连下去,当自旋必然次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让他申请的线程进入阻塞,机能低落。
13.14 自旋锁在Java中,自旋锁是指实验获取锁的线程不会当即阻塞,而是回收轮回的方法去实验获取锁,这样的长处是淘汰线程上下文切换的耗损,缺点是轮回会耗损CPU。
14.synchronized要害字领略利用了synchronized要害字可以轻松地办理多线程共享数据同步问题。
synchronized要害字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步要领和同步语句块。假如再细的分类,synchronized可浸染于instance变量、object reference(工具引用)、static函数和class literals(类名称字面常量)身上。
synchronized取得的锁都是工具;每个工具只有一个锁(lock)与之相关联;实现同步是要很大的系统开销作为价钱的,甚至大概造成死锁,所以只管制止无谓的同步节制。
synchronized的4种用法:
1. 要领声明时利用,线程得到的是成员锁;
2. 对某一代码块利用,synchronized后跟括号,括号里是变量,线程得到的是成员锁;
3. synchronized后头括号里是一工具,此时,线程得到的是工具锁;
4. synchronized后头括号里是类,此时,线程得到的是工具锁;
15.CAS无锁机制CAS:Compare and Swap,即较量互换;
jdk1.5增加了并发包java.util.concurrent.*,其下面的类利用CAS算法实现了区别于synchronized同步锁的一种乐观锁。jdk1.5之前java语言是靠synchronized要害字担保同步的,这是一种独有锁,也是灰心锁;
自己无锁,回收乐观锁的思想,在数据操纵时比拟数据是否一致,假如一致代表之前没有线程操纵该数据,那么就会更新数据,假如纷歧致代表有县城更新则重试;
CAS傍边包括三个参数CAS(V,E,N),V标识要更新的变量,E标识预期值,N标识新值
运行进程:1.线程会见时,先会将主内存中的数据同步到线程的事情内存傍边;
2.假设线程A和线程B都有对数据举办变动,那么如果线程A先获取到执行权限;
3.线程A先会比拟事情内存傍边的数据和主内存傍边的数据是否一致,假如一致(V==E)则举办更新,纷歧致则刷新数据,从头轮回判定;
4.这时更新完毕后,线程B也要举办数据更新,主内存数据和事情内存数据做比拟,假如一致则举办更新,纷歧致则将主内存数据从头更新到事情内存,然后轮回再次比拟两个内存中的数据,直到一致为止;
CAS无锁机制存在一个问题