Java 多线程-- 锁


CAS ( 比较并交换 ) compare-And-Swap shi CPU 原子指令,汇编指令  不会造成数据不一致 :自旋锁 ,Unsafe
AtomicInteger :


CAS缺点:保证一致性,但需要多次比较 ;循环时间长,开销大。只能保证一个变量的原子操作,。同时引出ABA问题,

二. volitile 避免指令重排,同步更新数据,应用於单例模式

三 .java 资源共享
 1.成员变量如果是非静态的 在多线程的环境下 都会为每个线程拷贝一个副本,各个线程维护独立的副本互不影响。

2.对共享资源写操作时会存在不安全的情况,如果只是读数据则没有影响。


3..join 是对象的方法 ,当前主线程被阻塞,当前线程插队 

四. 锁
 1. 偏向锁 ,自旋锁 ,轻量锁,重量锁 
 
 偏向锁:代码中不可能出现所线程并发争抢同一个锁的时候,

2 自旋锁: 尝试获取锁的线程不会立即阻塞,而是采用循环的方式尝试获取锁,好处是减少线程上下文切换,缺点是消耗CPU

 3公平锁:按照顺序
  非公平锁:不按顺序,后申请的线程有可能比先申请的线程优先获得锁,在高并发情况下

4 。 可重入锁( 又叫递归锁 ):同一线程外层函数获得锁后,内层递归函数仍然能获取该锁的代码。同一个线程在外层获取锁的时候,在进入内层方法会自动获取锁。即线程可以进入任何一个它已经拥有的锁或者同步着的代码块。

5.读写锁:ReentrantReadWriteLock

五。 阻塞队列
1.为什么要用
  不再需要关心什么时候阻塞线程,什么时候唤醒线程。
2.阻塞架构:

3.各个队列
SynchronousQueue: 只存放一个元素的队列。


。升级

synchronized  ——> lock 


Wait          ——> await 


Notify        ——> Singal 


六.synchronize 与 Lock区别 ,Lock的优势

A。synchronize 是JVM的关键字, 底层是monitorenter ,通过monitor对象来实现,wait和notify等方法也依赖于monito对象,只有在同步块方法中才能调wait、notify等方法。
 Monitorexit 。可重入锁, 底层有个计数器 ,有正常退出和异常退出。
 
B。 synchronized 不需要手动释放锁 。
C。不可中断 ,除非异常
D .非公平锁关键字
F. 没有condition 的

2.Lock 是API层面的,Concurent.Lock 
需要手动操作锁
B。ReentrantLock可以中断。2 可以设置超时方法tryLock( timeout , TimeUnit )
  可以lockInterruptibly() 放代码块中,调用interrupt () 方法可中断。

C。默认是非公平锁 ,默认的构造是false ,
D.ReentrantLock 用来实现分组唤醒需要唤醒的线程,可以精确唤醒,而不是像synchronize 要么随机唤醒一个,要么全部唤醒。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章