Lock分为
公平锁:线程获取锁的的顺序按照线程加锁的顺序来分配(先来先得)
非公平锁:获取锁的抢占机制,随机获得锁的,先来的不一定先得到锁
Lock lock = new ReentrantLock(true/false) ReentrantLock 类具有完全排他互斥效果,同一时间只有一个线程在执行ReentrantLock.lock()方法后的任务。
ReentrantReadWriteLock 类 读写锁
读锁: 共享锁 lock.readLock().lock()
写锁: 排它锁 lock.writeLock().lock()
读读不互斥,读写互斥,写写互斥
锁的四种状态: 从低到高 依次是: 无锁状态 偏向锁状态 轻量级锁状态 重量级锁状态 【锁的状态 可以升级,但是不能降级】
java通过锁和循环CAS实现院子操作
循环CAS的三大问题:①ABAS问题,可以使用版本号的思路来解决处理
②循环时间长,开销大
③只能保证一个共享变量的原子操作
java内存模型(JMM):
线程通信机制并发模型:①共享内存:隐式通信,显示同步(程序员必须显式指定某个方法或者某段代码需要在线程之间互斥执行)
②消息传递:显示通信,隐式同步(因为消息的发送必须在消息的接收之前)
java的并发采用的是前者,即共享内存模型
java线程之间的通信由JMM控制,每个线程都有一个抽象并不真实存在的本地内存,涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。
重排序:【为提高性能,编译器和处理器会对指令进行重排序】
①【编译器】编译器优化的重排序
②【处理器】指令级并行重排序
③【处理器】内存系统的重排序