一
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 要么随机唤醒一个,要么全部唤醒。