如何锁定常见实用程序类中的各个方法?

时间:2011-01-28 07:39:48

标签: java multithreading synchronization locking

我写了以下代码:

public class ClassLevelSynchronization {
    public static void main(String[] args) {
        new Thread(new AddThread()).start();
        new Thread(new MultiplyThread()).start();
    }
}

class UtilityCalculator{
    private static final Object ADD_LOCK = new Object();
    private static final Object MULTIPLY_LOCK = new Object();

    public static int add(int op1, int op2){
        synchronized (ADD_LOCK) {
            return op1+op2;
        }       
    }

    public static int multiply(int op1, int op2){
        synchronized (MULTIPLY_LOCK) {
            return op1*op2;
        }       
    }
}

class AddThread implements Runnable{
    public void run() {     
            for (int i = 0; i < 10; i++) {
                System.out.println("Addition of: "+i+" + "+(i+1)+" = "+UtilityCalculator.add(i, i+1));
            }   
    }
}

class MultiplyThread implements Runnable{
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("Multiplication of: "+i+" * "+(i+1)+" = "+UtilityCalculator.multiply(i, i+1));
        }
    }
}

如何确保AddThreadMultiplyThread的对象可以同时获取add(int op1, int op2)multiply(int op1, int op2)方法的锁定而不会相互阻塞?

换句话说,我想确保在任何给定时间两个线程可以同时使用UtilityCalculator类的两个方法。我该如何实现这一目标?我在代码中遗漏了什么吗?

2 个答案:

答案 0 :(得分:3)

你已经完成了 - 你正在同步不同的对象,所以应该没问题。您是否有某些理由怀疑这不起作用?

为了使 工作更明显,请在每个同步块内暂停一下。您的程序仍将在大约10秒内执行所有20个操作,表明线程没有相互阻塞。

答案 1 :(得分:2)

这两个方法已经使用两个不同的对象进行同步,因此已经可以调用并同时执行addmultiply来自不同线程的时间。

另外,我假设您知道这一点,但我必须添加它,只是为了确定:这些方法不需要任何同步,因为它们本质上是线程安全的。如果实际代码仅用于演示,则可以随意忽略它。