【发布时间】:2016-10-16 06:49:46
【问题描述】:
我有一个如下所示的方法。
public class CriticalSections
{
public void mainMethod(boolean b)
{
if (b) {
method1();
}
else {
criticalMethod();
method2();
}
}
private void criticalMethod()
{
System.out.println("in criticalMethod");
}
private void method1()
{
System.out.println("in method1");
}
private void method2()
{
System.out.println("in method2");
}
}
我需要限制对这些方法的访问,以便
- 当线程访问criticalMethod()时,应该限制所有其他线程对method1()和method2()的访问。类似地,当线程访问method1()和method2()时,访问criticalMethod() ) 应限制用于所有其他线程。
- method1() 可以单独被不同的线程同时访问。
- method2() 可以单独被不同的线程同时访问。
- method1() 和 method2() 可以被不同的线程同时访问。
为了满足第一个访问条件,我想出了以下代码, 但这不会满足其他 3 个条件,因此性能会受到影响。
public class CriticalSections
{
private final Lock lock1 = new ReentrantLock();
private final Lock lock2 = new ReentrantLock();
private final Lock lock3 = new ReentrantLock();
public void mainMethod(boolean b)
{
if (b) {
lock1.tryLock();
try {
method1();
}
finally {
lock1.unlock();
}
}
else {
lock1.tryLock();
try {
lock2.tryLock();
try {
lock3.tryLock();
try {
criticalMethod();
}
finally {
lock3.unlock();
}
}
finally {
lock2.unlock();
}
}
finally {
lock1.unlock();
}
}
lock3.tryLock();
try {
method2();
}
finally {
lock3.unlock();
}
}
private void criticalMethod()
{
System.out.println("in criticalMethod");
}
private void method1()
{
System.out.println("in method1");
}
private void method2()
{
System.out.println("in method2");
}
}
应该使用什么同步机制来满足上述场景?
【问题讨论】:
标签: java multithreading locking mutex critical-section