我正在经历多个线程概念。
public class Foo{
public void testMethod1(){
synchronized(foo.class){
// only one thread can access this block at a time
}
}
// or i can use the below method
public void testMethod2(){
synchronized(SomeClass.class){
// only one thread can access this block at a time
}
}
}
我将在我的代码中使用testMethod1或testMethod2。
如您所见,我在synchronized
的 Foo.class 上使用testMethod1()
,
和testMethod2()
中的 SomeClass.class 。
如果我使用它的任何方法在多线程访问中给出相同的结果。 我想知道用法之间的区别,当我必须为同步块使用相同的类和其他类用于同步块时。
或者上述两种方法有什么区别?
答案 0 :(得分:1)
我们在对象上同步,而不是在类上同步。这就是你所做的:你在两个不同的Class实例上进行同步。如果我们重写一下,它会变得更清晰:
public class Foo {
// the locks for the synchronized methods
private Class<Foo> lock1 = Foo.class;
private Class<SomeClass> lock2 = SomeClass.class;
public void testMethod1() {
synchronized (lock1) {
// only one thread can access this block at a time
}
}
public void testMethod2() {
synchronized (lock2) {
// only one thread can access this block at a time
}
}
}
我们有两个锁,两个方法可以并行执行,但每个方法一次只能由一个线程执行。
如果我们在两个方法上都使用相同的锁,那么方法就不能再并行执行了(如果一个线程已经输入方法1,那么方法2也会被锁定)
希望它有所帮助!