阻塞:对于同一个共享资源,采用内置锁,如果一个线程获取的锁被另一个线程获得,则进入阻塞的状态,一直等待线程释放锁之后,不响应中断。
重入:锁的申请针对线程,而不针对调用。内置锁是可重入的
=====================================================================================================
1.计算机的资源单一,基本都是多个设备共享,一方面方便管理,一方面设备通信变得比较容易。
2.引入锁机制就是为了对共享资源进行并发访问控制,防止资源操作不一致。(锁也有资源的开销,
使用不当,开销可能比线程的开销还要多)---开销也就是来回切换环境-----阻塞的有阻塞队列,就绪的有就绪队列以及就绪的环境变量等资源信息,所以存在资源消耗,需要CPU执行。
锁本身也是一种共享资源,所以对它也有进行同步控制,所有锁对象采取的是状态位(voilate)进行控制的,同时锁上面有对应的队列请求,对应的入、出队操作,保证操作的安全
synchronized与Lock在默认情况下是不会响应中断(interrupt)操作
a.锁-时间少,使用者少(请求少),共享锁替代独占锁
3.锁分类:
内部锁(常见的sync关键字)--对象的监视器--自动打开,自动关闭----属于独占锁的一种。
自旋锁:cas机制,不断的轮询,查看标志位---适合较短时间的等待,而借助操作系统的进程挂起,适合长时间等待也就是阻塞机制,到时自动唤醒
同步锁
可重入锁:如果一个线程持有某个管程对象上的锁,那么它就有权访问所有在该管程对象上同步的块。这就叫可重入。
4.
===========================================================
cas机制:https://www.ibm.com/developerworks/cn/java/j-jtp11234/
非阻塞算法:http://www.ibm.com/developerworks/cn/java/j-jtp04186/
AQS机制:http://www.blogjava.net/xylz/archive/2010/07/06/325390.html
个人理解:cas-硬件同步原语,就是比较并交换(内存,预期,新值):起初内存中是预期的值,之后预期值和新值比较,一致则修改内存值为新值,否则什么也不做。
锁的粒度越细,并发度越高。
cas机制是一种思想,硬件采用这种思想实现同步原语,jdk1.5本质同步原语基于CAS机制实现,最终转换成硬件同步原语实现,效率高。(cas就是实现原子操作的微命令,保证操作时原子性)
AQS:AQS是concurrent包中的一系列同步工具的基础实现,其提供了状态位,线程阻塞-唤醒方法,CAS操作(程序原子操作)。基本原理就是根据状态位来控制线程的入队阻塞、出队唤醒来解决同步问题
======================================================
AQS:AbstractQueuedSynchronizer一个类:
获取锁:首先判断当前状态是否允许获取锁,如果是就获取锁,否则就阻塞操作或者获取失败,也就是说如果是独占锁就可能阻塞,如果是共享锁就可能失败。另外如果是阻塞线程,那么线程就需要进入阻塞队列。当状态位允许获取锁时就修改状态,并且如果进了队列就从队列中移除。
释放锁:这个过程就是修改状态位,如果有线程因为状态位阻塞的话就唤醒队列中的一个或者更多线程
- 原子性操作同步器的状态位
- 阻塞和唤醒线程
- 一个有序的队列
LockSupport支持线程阻塞,唤醒-----挂起或者唤醒机制(本质调用操作系统的进行同步原语---硬件的微命令操作)
AQS采用的CHL模型:对于入队列(enqueue):采用CAS操作,每次比较尾结点是否一致,然后插入的到尾结点中。对于出队列(dequeue):由于每一个节点也缓存了一个状态,决定是否出队列,因此当不满足条件时就需要自旋等待,一旦满足条件就将头结点设置为下一个节点
==================================================================================================
一元信号量机制
二元信号量机制
多元信号量机制
原语操作(微命令)
资源(共享资源)
监视器(轮询性质)
===================================================================================================