Java完成线程同步的三种方式

一、同步代码块

- 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() 解锁 * * * 目的:读读不互斥 写写互斥 读写互斥
经验分享 程序员 微信小程序 职场和发展