一、同步代码块
- synchronized 关键字
* - 语法
* synchronized(对象锁){
* //代码块
* }
* - "对象锁"可以有哪些表现形式
* 1.1.1 this who调用方法,who就是对象锁
* 若使用同一个对象(同一把对象锁)执行方法,出现"等待现象";
* 若使用不同对象(不是同一把对象锁)执行方法,出现"争抢现象";
*
* 1.1.2 类.class 无论创建多少个对象,对象锁都是同一把 "类锁"
* 若使用同一个对象(同一把对象锁,即类锁)执行方法,出现"等待现象";
* 若使用不同对象(同一把对象锁,即类锁)执行方法,出现"等待现象";
*
* 1.1.3 字符串,例如"A" "B"
* synchronized代码块中一旦直接指定同一个字符串,相当于在字符串常量池中直接分配内存空间,一定会出现"等待现象"
*
* 1.1.4 byte[] lock = new byte[0]; 开销较小
* 一旦将byte[]字节数组声明为属性,效果等同于this
二、同步方法
- synchronized 关键字
* - 语法
* public synchronized void/返回值数据类型 方法名(形参列表){ //方法体 }
* - 作用
* 1.2.1 synchronized修饰非静态方法时,当前调用的对象就是对象锁,此时对象锁this;
* 若使用同一个对象(同一把对象锁)执行方法,出现"等待现象";
* 若使用不同对象(不是同一把对象锁)执行方法,出现"争抢现象";
*
* 1.2.2 synchronized修饰静态方法时,当前类.class就是对象锁,此时对象锁类类型;
* 若使用同一个对象(同一把对象锁,即类锁)执行方法,出现"等待现象";
* 若使用不同对象(同一把对象锁,即类锁)执行方法,出现"等待现象";
三、Lock锁
- Lock接口 - ReentrantLock实现类
* ReadWriteLock接口 - ReentrantReadWriteLock实现类
*
* ReentrantReadWriteLock 可重入的读写锁
* - 静态内部类 读锁 ReentrantReadWriteLock.ReadLock implements Lock
* - ReadLock的获取和释放 "读读不互斥、读写互斥"
* 当WriteLock已经被其他线程获取,当前线程获取ReadLock失败;否则获取成功,支持重入性。ReadLock释放时通过CAS操作将读状态减一
*
* - API方法
* public void lock() 上锁
* public boolean tryLock() 尝试获取锁
* public void unlock() 解锁
*
* - 静态内部类 写锁 ReentrantReadWriteLock.WriteLock implements Lock
* - WriteLock的获取和释放 "读写互斥和写写互斥"
* 当ReadLock已经被其他线程获取,或者WriteLock被其他线程获取,当前线程获取WriteLock失败;否则获取成功,支持重入性。WriteLock释放时通过CAS操作将读状态减一
*
* - API方法
* public void lock() 上锁
* public boolean tryLock() 尝试获取锁
* public void unlock() 解锁
*
*
* 目的:读读不互斥 写写互斥 读写互斥