当另一个线程将同步对象锁定时,是否可以通过同步代码块?如果没有,是否有替代方案可以采取这种方式?java并在另一个线程持有锁时传递同步块
2
A
回答
4
您可以用java.util.concurrent.locks.ReentrantLock
类替换块。这个类提供了非常相似的互斥功能,但它也有方法tryLock
,如果它是空闲的,它会获得锁,或者如果它被采用,则立即返回false。
所以,你可以有这样的:
// thread 1 has normal synchronized behavior
rlock.lock();
// code
rlock.unlock();
和线程2:
// thread 2 will skip the code if the lock is already taken
if(rlock.tryLock()) {
// code
rlock.unlock();
}
private final ReentrantLock rlock = new ReentrantLock();
码线1
2
它可以用警卫对象完成。警卫对象具有这样的功能:
锁定警戒对象。
检查是否设置了警戒标志。如果是这样,返回
false
,解锁守卫对象。设置防护标志。
返回
true
,解锁警卫对象。
如果主叫方得到true
,它知道它可以在不与任何其他线程冲突的,因为只有一个线程可以直到它被重新设置为false
从false
保护标志设置为true
受保护对象进行操作,并其他线程只有在设置了防护标志时才访问该对象。
完成后,再锁定在保护对象并清除保护标记,以允许在其他线程。
防护对象的锁定可以,当然,是通过使用同步功能隐式的。通常你不会创建一个只是为了防范的对象,而是折叠与为什么需要将对象保护到守卫对象中相关的其他功能。
相关问题
- 1. 同步块上的Java线程锁
- 2. Java线程和同步块
- 3. Java线程:同步块
- 4. java线程同步块
- 5. 一个线程可以同时持有两个锁吗?
- 6. Java IllegalStateMonitorException同时持有锁
- 7. 多个线程持有相同的锁?
- 8. 净线程 - 将一个线程锁定所有同步块单个锁定对象
- 9. 线程并发 - 同步和锁定。
- 10. 线程:同步块
- 11. 当另一个线程可能存在或不存在时线程同步
- 12. Java同步锁
- 13. 另一个线程内部的Java同步
- 14. 同步块锁定
- 15. 在java中发生线程同步时?
- 16. Java同步线程
- 17. Java线程同步
- 18. Java线程“同步”
- 19. 在java中同步线程
- 20. 在Java线程中同步
- 21. 同步,锁定与广播传递
- 22. 同时使用两个线程访问两个同步块
- 23. 如何将对象从主线程传递到java中的另一个线程
- 24. 以编程方式确定哪个Java线程持有锁
- 25. 在Jmeter中将参数从一个线程传递到另一个线程
- 26. .NET Task.Result块(同步)线程
- 27. Java中的监视器和同步块(看起来两个线程同时拥有一个监视器)
- 28. 如何锁定一个线程,并等待锁定将在另一个线程中释放
- 29. Java锁和解锁不同的线程
- 30. 同步对象传递给线程与计时器