类中有两种方法,都是同步的。 有两个线程同时运行。 thread1是否可以同时执行method1和thread2执行method2?
class A {
public synchronized void method1() {
}
public synchronized void method2() {
}
}
答案 0 :(得分:3)
请记住,锁在实例级别工作,而不是在类级别工作。对于A
的每个实例,method1
和method2
之间的任何一个实例都可以在任何给定时刻运行。
但是,如果A
有两个不同的实例,例如a1
和a2
,则a1.method1()
可以与a2.method1()
(或{{1}交错运行}})。
答案 1 :(得分:1)
您的代码无法使用。
当您对整个方法使用关键字synchronized
时,会对对象this
执行锁定。因此两种方法的锁相同(如果在同一对象上执行)。
但是如果你需要允许两个不同的线程同时访问method1和method2,你可以改变锁定:
Object lock1 = new Object();
Object lock2 = new Object();
public void method1() {
synchronized(lock1) {
...
}
}
public void method2() {
synchronized(lock2) {
...
}
}
这样做可以将同步锁定从this
更改为lock1
的对象method1
以及lock2
method2
答案 2 :(得分:0)
不,同步会锁定一个对象,而不仅仅是该方法。一旦一个线程访问一个synchronized方法,该类中的其余方法(同步或不同步)将不再被任何其他线程访问,直到正在运行的线程进入可运行状态,其中锁定可用于下一个线索获得。
答案 3 :(得分:0)
所以我相信你问的问题是,“如果同步这两种方法,两个不同的线程能够访问两种不同的同步方法吗?”
答案是,这取决于。
与您提供的语法同步发生在实例级别。
因此,如果线程1和线程2访问同一个实例,则否。 线程2被锁定,直到线程1可以处理。
但是,如果线程1和线程2访问不同的实例,则是。 线程2不必等到线程1完成,因为实例不同。
更多同步参考: