1.AQS(AbstractQueuedSynchronizer )
-
AQS的必要性
是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。并发包的大师(Doug Lea)期望它能够成为实现大部分同步需求的基础。 -
AQS使用方式和其中的设计模式
1.getState()
2.setState(int newState)
3.compareAndSetState(int expect,int update)) -
模板方法设计模式
实现自定义同步组件时,将会调用同步器提供的模板方法,
image.gif -
CLH队列锁
CLH队列锁也是一种基于链表的可扩展、高性能、公平的自旋锁,申请线程仅仅在本地变量上自旋,它不断轮询前驱的状态,假设发现前驱释放了锁就结束自旋。 -
ReentrantLock
ReentrantLock的构造函数中,默认的无参构造函数将会把Sync对象创建为NonfairSync对象,这是一个“非公平锁”;
而另一个构造函数ReentrantLock(boolean fair)传入参数为true时将会把Sync对象创建为“公平锁”FairSync。 -
锁的可重入
重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁所阻塞,该特性的实现需要解决以下两个问题。
1)线程再次获取锁。锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。
2)锁的最终释放。线程重复n次获取了锁,随后在第n次释放该锁后,其他线程能够获取到该锁。锁的最终释放要求锁对于获取进行计数自增,计数表示当前锁被重复获取的次数,而锁被释放时,计数自减,当计数等于0时表示锁已经成功释放。
2.JMM基础(Java Memory Model )
计算机存储 java内存模型java内存模型
-
java线程的操作只能在自己的工作内存中操作,不能直接操作主内存
-
可见性
可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。 -
原子性
即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 -
volatile
volatile关键字修饰的变量会存在一个“lock:”的前缀。
该指令会将当前处理器缓存行的数据直接写会到系统内存中,
且这个写回内存的操作会使在其他CPU里缓存了该地址的数据无效 -
Synchronized
Synchronized在JVM里的实现都是基于进入和退出Monitor对象来实现方法同步和代码块同步,虽然具体实现细节不一样,但是都可以通过成对的MonitorEnter和MonitorExit指令来实现。
对同步方法,从同步方法反编译的结果来看,方法的同步并没有通过指令monitorenter和monitorexit来实现,相对于普通方法,其常量池中多了ACC_SYNCHRONIZED标示符。
volatile 只保证了可见性
synchronized 可以保证可见性和原子性
网友评论