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() 解锁 * * * 目的:读读不互斥 写写互斥 读写互斥

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/290254.html

(0)
上一篇 2022年10月1日
下一篇 2022年10月1日

相关推荐

发表回复

登录后才能评论