Java显示锁

显示锁

Lock是显示锁的顶层实现的接口,所有的显示锁都是实现Lock接口

1、ReentrantLock

ReentrantLock是对Lock的实现,提供与synchronized相同的互斥性和内存可见性。

与进入或退出同步代码块相同的内存语义。

1.1 轮询锁与定时锁

内置锁中,死锁的唯一恢复途径是重启程序,防止死锁的唯一方法是避免锁顺序的不一致。

在不能获取所有需要的锁时,可采用定时锁和轮询锁,使你重新获取控制权,它会释放已经获得的锁,然后重新尝试获取所有锁或记录失败并采取其他措施。

1.2 可中断的锁获取操作

2、性能考虑因素

Java5中ReentrantLock明显高于内置锁,但是,性能这方面,只能说当时有效,有可能明天就不行了。还是要与时俱进。

3、公平性

当持有锁的时间较长或者请求锁的平均时间间隔长,使用<公平锁>。

在竞争激烈的情况下,非公平锁性能高于公平锁的性能的一个原因是:恢复一个被挂起的线程与该线程真正开始运行之间存在严重的延迟。

4、synchronized与ReentrantLock之间选择

仅当内置锁不能满足需求是,才可以考虑使用ReentrantLock,就是需要一些高级功能时:可定时的、可轮询的、可中断的锁获取操作,公平队列,非块结构的锁。否则,优先使用synchronized

5、读-写锁

ReentrantLock实现是标准的互斥锁,即同一时间最多只有一个线程能持有ReentrantLock,就会牺牲一些并发性。

而读-写锁的思想是:同时可以多读或者单写(两者不能同时发生)。只要保证每个线程都能确保读取到最新的数据,并且在读的时候不会有其他线程修改数据,就不会发生问题。

选择上,如果分析结果表明读-写锁没有提高性能,那么可以将读-写锁换成独占锁(ReentrantLock)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java多线程中,的使用是为了控制对共享资源的访问,以避免多个线程同时对同一资源进行修改而导致数据不一致或竞态条件的问题。Java提供了两种的机制:synchronized关键字和Lock接口。 1. synchronized关键字: - synchronized关键字可以用来修饰方法或代码块,使其成为同步方法或同步块。 - 当一个线程访问同步方法或同步块时,会自动获取该方法或代码块所在对象的,并在执行完后释放。 - 其他线程在获取之前会被阻塞,直到被释放。 - 示例代码: ```java public synchronized void synchronizedMethod() { // 同步方法 } public void synchronizedBlock() { synchronized (this) { // 同步块 } } ``` 2. Lock接口: - Lock接口是Java提供的显示机制,提供了更灵活的定方式。 - Lock接口的常用实现类是ReentrantLock,它具有与synchronized相似的语义。 - 示例代码: ```java Lock lock = new ReentrantLock(); public void lockMethod() { lock.lock(); try { // 加的代码 } finally { lock.unlock(); // 必须在finally块中释放,以防止异常导致无法释放 } } ``` 在使用时,需要注意以下几点: - 的粒度应尽量小,只定必要的代码块,以减少线程间的竞争。 - 避免死,即多个线程相互等待对方释放的情况。 - 保证的正确使用,避免忘记释放或错误地释放,可以使用try-finally语句块来确保的释放。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值