我写了以下代码:
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));
}
}
}
如何确保AddThread
和MultiplyThread
的对象可以同时获取add(int op1, int op2)
和multiply(int op1, int op2)
方法的锁定而不会相互阻塞?
换句话说,我想确保在任何给定时间两个线程可以同时使用UtilityCalculator
类的两个方法。我该如何实现这一目标?我在代码中遗漏了什么吗?
答案 0 :(得分:3)
你已经完成了 - 你正在同步不同的对象,所以应该没问题。您是否有某些理由怀疑这不起作用?
为了使 工作更明显,请在每个同步块内暂停一下。您的程序仍将在大约10秒内执行所有20个操作,表明线程没有相互阻塞。
答案 1 :(得分:2)
这两个方法已经使用两个不同的对象进行同步,因此已经可以调用并同时执行add
和multiply
来自不同线程的时间。
另外,我假设您知道这一点,但我必须添加它,只是为了确定:这些方法不需要任何同步,因为它们本质上是线程安全的。如果实际代码仅用于演示,则可以随意忽略它。